일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- a tour of go
- JUCE library
- Docker
- 알고리즘
- OS
- C++ library
- tour of go
- LOB
- vim-go
- C언어
- JUCE 튜토리얼
- 공룡책
- C++
- 자료구조
- 프로그래밍
- C++ gui
- go
- gui
- 백준
- JUCE
- 연결리스트
- C++ gui 라이브러리
- 리듬게임
- Nebula
- go channel
- JUCE라이브러리
- BOJ
- c++ heap
- 코딩
- 운영체제
- Today
- Total
CafeM0ca
[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를 빈번하게 잠그고 풀기 때문이다.
'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 |