C++条件変数condition_variableの使い方
10709 ワード
一、条件変数の概要
条件変数は、1つのスレッドが1つ以上の他の待機中のスレッドを呼び出し、スレッド間の同期を実現することができる.生産者消費者モデルは条件変数で実現できる.
二、条件変数の例
ソースコード
しゅつりょく
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
条件変数は、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