condition variable 예제

변수를 수정하려는 스레드는 클래스 std:::condition_변수에 표준 레이아웃 유형입니다. 복사 생성 가능, 이동생성 가능, 복사 할당 가능 또는 Move할당이 아닙니다. 이 문제를 어떻게 해결할 수 있습니까? 가짜 웨이크 업을 제거 한 술어는 잃어버린 웨이크 업에도 도움이 될 것입니다. 조건자가 true인 경우 수신자는 보낸 사람의 알림과 독립적으로 작업을 계속할 수 있습니다. 변수 데이터Ready는 메모리와 같습니다. 28줄의 가변 데이터가 true로 설정되어 있기 때문에 수신기는 21호선에서 알림이 배달되었다고 가정합니다. 짧은 발언 – 데이터준비. dataReady는 변경될 공유 변수입니다. 그래서 자물쇠로 보호해야했습니다. 스레드 t1이 잠금을 한 번만 설정하고 해제하기 때문에 std::lock_guard는 해당 작업에 적합합니다.

스레드 t2에 대해 유지되지 않습니다. 대기 메서드는 뮤텍스를 계속 잠그고 잠금을 해제합니다. 그래서 더 강력한 잠금이 필요합니다 : std ::unique_lock. 함수를 호출하기 전에 뮤텍스를 잠가야 합니다. 즉, 다른 스레드가 조건 변수를 사용하려고 하는 경우 스레드가 대기할 수 있습니다. 대기 함수가 스레드를 대기 상태로 만들고 자동으로 뮤텍스의 잠금을 해제하기 때문에 대부분의 경우 뮤텍스가 잠기지 않습니다. pthread_cond_wait()는 뮤텍스에 의해 지정된 잠금을 해제하고 조건 cond 변수를 기다립니다. pthread_cond_signal() 구문 : 이 함수는 단순히 0초에서 4초의 임의의 숫자를 기다린 다음 뮤텍스를 잠그고 완료된 스레드를 나타내는 데 사용되는 공유 전역 변수를 변경합니다. 전역 변수에 대한 액세스도 tht 뮤텍스에 의해 잠겨 있습니다.

그런 다음 대기 중인 스레드를 시작하는 조건 변수에 신호를 표시하고 마지막으로 뮤텍스의 잠금을 해제합니다. 지정된 시간(초) 동안 스레드가 일시 중단되는 POSIX 함수인 절전 모드의 사용을 확인합니다. 문제는 수신자가 대기 상태에 도착하기 전에 보낸 사람에게 알림을 보내면 알림이 손실된다는 것입니다. C++ 표준은 조건 변수를 동시에 동기화 메커니즘으로 설명합니다. 그래서 notfication 손실되고 수신기가 기다리고 기다리고 기다리고 있습니다 … . 조건 변수는 이해하기 어렵고 처음 만날 때 사용하기가 까다로울 수 있습니다. 그러나, 그들은 당신이 다른 방법으로 할 어려운 일을 할 수 있습니다. 이 추출은 IoT 컨텍스트에서 C에 대한 내 책에서 발췌한 것입니다.

첫 번째 예제 conditionVariable.cpp의 주요 차이점은 부울 데이터추가 조건으로 11줄에 사용되는 부울 데이터입니다. dataReady는 28호에서 true로 설정됩니다. 그것은 대기하는 함수에서 체크 무너지지 않습니다ForWork: condVar.waint (lck,[]반환 데이터준비;}). 그렇기 때문에 wait() 메서드에는 조건어를 허용하는 추가 오버로드가 있습니다. 술어는 참 또는 거짓으로 반환되는 호출 가능한 것입니다. 이 예제에서 호출 가능 은 람다 함수입니다. 따라서 조건 변수는 조건자가 true인지 또는 알림이 발생했는지 두 가지 조건을 확인합니다. 이 장의 앞에서 설명한 것처럼 모든 스레드가 조인을 사용하여 완료될 때까지 쉽게 기다릴 수 있습니다. 그러나 그룹의 첫 번째 스레드가 완료될 때까지 기다리는 관련 문제는 더 어려운 문제이지만 조건 변수를 사용하여 쉽게 해결할 수 있습니다. 조건 변수를 사용하면 스레드 집합이 간질 때까지 절전 모드로 잠들어 있습니다! 한 스레드 또는 절전 중인 모든 스레드를 간질 수 있습니다.

스레드가 하나만 절전 모드 해제되면 운영 체제에서 해제할 스레드를 결정합니다. 스레드를 직접 절전 모드 해제하지 않고 조건 변수를 `신호`한 다음 조건 변수 내에서 절전 모드인 스레드 중 하나(또는 모두)를 절전 모드해제합니다.

Spread the love