unique_lock 예제

이전과 마찬가지로 fill() 함수는 각 반복에 따라 난수를 생성하고 random_numbers 컨테이너에 배치합니다. 다른 스레드가 동시에 컨테이너에 액세스하지 못하도록 차단하려면 전용 잠금이 사용됩니다. 이 예제에서는 1초를 기다리는 대신 조건 변수를 사용합니다. notify_all()을 호출하면 wait()를 통해 이 알림을 기다리는 모든 스레드가 절전 모드해제됩니다. 엄지 손가락의 규칙은 항상 std를 사용하는 것입니다::lock_guard. 그러나 std::unique_lock에서 사용할 수 있는 더 높은 수준의 기능이 필요한 경우 std::unique_lock을 사용해야 합니다. 우리는 std::lock_guard와 std::unique_lock의 차이점을 배웠습니다. std::unique_lock을 사용해야 하는 몇 가지 상황도 나열했습니다. 이 경우 함수 lock_data()는 데이터를 보호하는 데 사용되는 뮤텍스에 대한 잠금을 획득한 다음 포인터와 함께 데이터를 data_handle으로 전송합니다. 그런 다음 이 잠금은 핸들이 소멸될 때까지 data_handle에 의해 유지되므로 잠금이 해제되지 않고 데이터에 대해 여러 작업을 수행할 수 있습니다. std::unique_lock은 이동이 가능하기 때문에 lock_data에서 반환하는 데 필요한 data_handle도 쉽게 이동할 수 있습니다. 동기화는 어떻게 작동합니까? 이 프로그램에는 t1과 t2의 두 자식 스레드가 있습니다.

그들은 대기 자신의 작업 패키지를 얻을ForWork 및 setDataRead 줄 (1 과 2). setDataReady 는 조건 변수 condVar을 사용하여 작업 준비와 함께 수행된다는 것을 알려줍니다. 잠금을 보유하는 동안 스레드 t1은 알림을 기다립니다: condVar.wait(lck, []{{ 반환 데이터준비; }) (4호선)을 참조하십시오. 발신자와 수신자는 잠금이 필요합니다. 보낸 사람의 경우 std::lock_guard는 잠금을 호출하고 한 번만 잠금을 해제하기 때문에 충분합니다. 수신기의 경우 일반적으로 자주 잠그고 뮤텍스의 잠금을 해제하기 때문에 std::unique_lock이 필요합니다. 클래스 unique_lock기본 잠금 요구 사항을 충족합니다. Mutex가 잠금 가능한 요구 사항을 충족하는 경우 unique_lock도 잠금 가능한 요구 사항을 충족합니다(예: std::lock에서 사용할 수 있음). Mutex가 TimedLockable 요구 사항을 충족하는 경우 unique_lock도 TimedLockable 요구 사항을 충족합니다. 조건 변수에서 std:::condition_variable::wait(…) 입력으로 std::unique_lock이 필요하기 때문에 std:unique_lock을 사용해야 했습니다. std::unique_lock에는 std::lock_guard의 모든 기능이 있습니다. std::lock_guard로 할 수 있는 모든 것은 std::unique_lock으로도 가능합니다.

그래서, 우리는 언제 std를 사용 해야::lock_guard? fill() 함수 내에서 는 새로운 난수를 random_numbers에 삽입하기 때문에 boost::unique_lock 형식의 단독 잠금이 필요합니다. fill() unlock() 멤버 함수를 사용하여 뮤텍스를 해제한 다음 1초 동안 기다립니다. 이전 예제와 달리 wait()는 for 루프의 끝에서 호출되어 print() 또는 count()에 의해 액세스되기 전에 하나 이상의 난수가 컨테이너에 배치되도록 보장합니다. 이 두 함수는 for 루프의 시작 부분에서 wait() 함수를 호출합니다. std:::unique_lock의 유연성이 사용되는 한 곳은 std::condition_variable입니다. std:::condition_variable은 조건 변수의 구현을 제공하므로 스레드가 특정 조건이 true임을 통보받을 때까지 기다릴 수 있습니다. 대기 할 때 조건과 관련된 데이터를 보호하는 뮤텍스에 잠금을 소유하는 std::unique_lock 인스턴스를 통과해야합니다. 조건 변수는 std::unique_lock의 유연성을 사용하여 대기 하는 동안 뮤텍스의 잠금을 해제한 다음 호출자에게 반환하기 전에 다시 잠급니다. 이렇게 하면 스레드가 차단되는 동안 다른 스레드가 보호된 데이터에 액세스할 수 있습니다.

Mentalny Teatr Hipnozy > unique_lock 예제