[C++11] 조건변수
조건변수는 메시지를 통한 스레드의 동기화에 사용된다.
<condition_variable>에 정의되어 있다.
한 스레드가 메시지 발신자 역할을 하면 다른 스레드는 수신자가 된다.
수신자는 발신자의 알림을 기달리게 된다. 전형적으로 발신자-수신자 또는 생상자-소비자 흐름에 쓰인다.
출처: (cpp_reference)
조건변수 멤버함수들
#include <iostream>
#include <condition_variable>
#include <mutex>
#include <thread>
std::mutex mutex_;
std::condition_variable condVar;
using namespace std;
bool dataReady{ false };
void doTheWork() {
std::cout << "Processing shared data." << std::endl;
}
void waitingForWork() {
cout << "Worker: Waiting for work." << endl;
unique_lock<mutex> lck(mutex_);
condVar.wait(lck, [] {return dataReady; });
doTheWork();
cout << "Work Done." << endl;
}
void setDataReady() {
{
lock_guard<mutex> lck(mutex_);
dataReady = true;
}
cout << "Sender: data is ready." << endl;
condVar.notify_one();
}
int main() {
thread t1(waitingForWork);
thread t2(setDataReady);
t1.join();
t2.join();
return 0;
}
conVar.wait(lck, []{return dataReady;})에 의해 t1은 알림을 기달린다.
발신자와 수신자는 잠김이 필요한데 발신자는 std::lock_guard만 있으면 충분하다. 잠김과 잠김 해제를 한 번만 호출하기 때문이다.
수신자는 std::unique_lock이 필수다. mutex를 빈번하게 잠그고 풀기 때문이다.