CafeM0ca

[C++11] 조건변수 본문

Programming/C++

[C++11] 조건변수

M0ca 2018. 9. 16. 18:14
반응형

조건변수는 메시지를 통한 스레드의 동기화에 사용된다.

<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를 빈번하게 잠그고 풀기 때문이다.



반응형

'Programming > C++' 카테고리의 다른 글

[EOS]EOS Tool 설명  (0) 2018.10.14
[EOS] eosio.cdt build sys error  (0) 2018.10.12
[C++] std::call_once, std::once_flag  (0) 2018.09.16
[C++] explicit  (0) 2018.07.23
[C++] Rule of Three, Rule of Five, Rule of Zero  (0) 2018.07.22
Comments