C++条件変数condition_variableの使い方


一、条件変数の概要
条件変数は、1つのスレッドが1つ以上の他の待機中のスレッドを呼び出し、スレッド間の同期を実現することができる.生産者消費者モデルは条件変数で実現できる.
二、条件変数の例
ソースコード
#pragma once
#include 
#include 
#include 
#include 
using namespace std;
class ConditionVariableTest
{
private:
	static mutex _queueMutex;
	static queue<int> _queue;
	static condition_variable _queueConditionVar;
public:
	void DoTest()
	{
		thread providerThread(Provider);
		int consumerNum = 2;
		thread** consumerThread = new thread*[consumerNum];
		for (int i = 0; i < 2; i++)
		{
			consumerThread[i] = new thread(Consumer,i+1);
		}		
		providerThread.join();

	}
	static void Provider() 
	{
		for (int i = 0; ; i+=2)
		{
			_queueMutex.lock();
			_queue.push(i);
			printf("provider v=%d
"
, i); _queue.push(i+1); printf("provider v=%d
"
, i+1); _queueMutex.unlock(); _queueConditionVar.notify_all(); this_thread::sleep_for(chrono::milliseconds(1000));//1000ms 1 } } static void Consumer(int id) { while (true) { {//uniqueLock , , unique_lock<mutex> uniqueLock(_queueMutex); //unique_lock mutex , mutex , unique_lock ( ), mutex _queueConditionVar.wait(uniqueLock, [] {return !_queue.empty(); }); // // uniqueLock // _queueConditionVar notify, wait , int v = _queue.front(); _queue.pop(); printf("consumer%d v=%d
"
, id, v); } } } }; mutex ConditionVariableTest::_queueMutex; queue<int> ConditionVariableTest::_queue; condition_variable ConditionVariableTest::_queueConditionVar;

しゅつりょく
provider v=0 provider v=1 consumer1 v=0 consumer1 v=1 provider v=2 provider v=3 consumer2 v=2 consumer2 v=3 provider v=4 provider v=5 consumer2 v=4 consumer2 v=5 provider v=6 provider v=7 consumer2 v=6 consumer2 v=7 provider v=8 provider v=9 consumer2 v=8 consumer2 v=9 provider v=10 provider v=11 consumer1 v=10 consumer1 v=11