멀티스레드 예제 c++

Off
Non classé

일반적인 예는 중간 우선 순위 작업(M)이 우선 순위가 높은 작업을 선점하여 우선 순위 반전을 초래하는 것입니다. 우선순위가 낮은 프로세스(L)는 높은 우선순위 프로세스(H)가 액세스하고자 하는 자원을 획득하지만, 중간 우선순위 프로세스(M)에 의해 선점되고 있으므로, 중간 우선순위 프로세스(M)가 종료되는 동안 높은 우선순위 프로세스(H)가 자원상에서 차단된다. 이는 우선 순위가 낮은 프로세스에서 리소스를 사용하는 동안 중간 우선 순위(M)의 세 번째 작업이 실행 가능해질 때 발생할 수 있습니다. 우선 순위가 높은 작업을 실행할 수 없게 되면 중간 우선 순위(M)의 세 번째 작업이 가장 높은 우선 순위 실행 가능한 작업이므로 실행되고 L은 리소스를 포기할 수 없습니다. 따라서 이 시나리오에서는 중간 우선 순위 작업(M)이 우선 순위가 높은 작업(H)을 선점하여 우선 순위 반전을 초래합니다. 교착 상태를 방지하는 방법 – 생산자 /소비자 문제 매우 간단한 예제에서 시작하여 뮤텍스 (이진 세마포)를 사용하여 생산자 / 소비자 (일명 경계 버퍼) 문제에 대한 솔루션을 제공합니다. 그것은 뿐만 아니라 죽은 자물쇠 케이스를 가지고 있으며, 잠금의 범위를 줄여 해결합니다. 예를 들어 코드는 PThread: 스핀 잠금을 방문하십시오. 두 사람 A와 B가 같은 계정을 공유하고 동시에 대략 입금하려고 한다고 가정해 보세요. 다음 예에서, 그들은 1 $ 백만 번 입금.

따라서 잔액은 $2,000,000가 될 것으로 예상됩니다. 그러나 출력에서 볼 수 있듯이 이 예제에서는 구조를 통해 여러 인수를 전달하는 방법을 보여 주는 것으로 나타났습니다. 다음 예제에서 설명한 대로 무효를 가리키기 때문에 스레드 콜백에 데이터 형식을 전달할 수 있습니다 . 스레드는 각각의 작업을 수행하기 위해 경주합니다. 대부분의 경우 상대 적 순서가 다를 수 있지만 가능한 모든 결과가 허용되기 때문에 매우 심각합니다. 예를 들어 두 스레드가 처리를 위해 큐에 항목을 추가하는 경우 일반적으로 시스템의 고정이 유지되는 경우 어떤 항목이 먼저 추가되는지는 중요하지 않습니다. 잠금을 사용하면 여러 스레드가 동시에 개체에 액세스하지 않도록 보장하지만 성능이 크게 저하될 수 있습니다. 여러 스레드가 실행되는 프로그램을 상상해 보십시오. 각 스레드가 특정 개체를 사용해야 하고 실행하기 전에 해당 개체에 대한 단독 잠금을 얻기 위해 기다려야 하는 경우 스레드는 모두 실행이 중지되고 서로 뒤로 백업되어 성능이 저하됩니다. 이러한 이유로 단위로 실행해야 하는 코드가 있는 경우에만 잠금을 사용해야 합니다. 예를 들어 상호 종속된 여러 리소스를 업데이트할 수 있습니다.

이러한 코드는 원자성이라고합니다. 잠금을 원자적으로 실행해야 하는 코드로만 제한하면 성능이 양호하면서도 데이터의 안전을 보장하는 다중 스레드 구성 요소를 작성할 수 있습니다. 또한 교착 상태가 발생할 수 있는 상황을 피하기 위해 주의해야 합니다. 이 경우 여러 스레드가 서로 공유 리소스를 해제할 때까지 기다립니다. 예를 들어 스레드 1은 리소스 A에 대한 잠금을 보유할 수 있으며 리소스 B. Thread 2를 기다리는 반면 리소스 B에 대한 잠금이 있고 리소스 A를 기다릴 수 있습니다. 이 경우 두 스레드 모두 진행할 수 없습니다. 교착 상태 상황을 방지하는 유일한 방법은 신중한 프로그래밍을 사용하는 것입니다. 주 스레드가 별도의 스레드를 만드는 예제를 살펴보겠습니다. 이 새 스레드를 만든 후 주 스레드는 콘솔에서 일부 데이터를 인쇄한 다음 새로 만든 스레드가 종료될 때까지 기다립니다. 이 문제는 임계 섹션이 원자적으로 실행되지 않을 때 발생합니다. 스레드 실행은 공유 상태에 따라 다릅니다.

예를 들어 두 스레드는 변수 i를 공유하고 1씩 증분하려고 합니다. 그것은 그들이 그것을 얻을 때 그리고 그들은 그것을 저장 하는 경우에 매우 의존. 예를 들어 서버가 대처할 수 있는 만큼의 동시 연결을 제공할 수 있는 서버를 만들려면 각 연결에 새 스레드를 바치면 이러한 작업을 비교적 쉽게 수행할 수 있습니다.

Comments are closed.