Condition简介
Condition,条件变量。当条件没达到时,线程阻塞。当条件达到时,线程运行。
OpenThreads库的Condition,需要依赖Mutex才能运行。条件没达到时,调用Condition的wait函数,去等待条件。条件达到时,调用Condition的signal放行一个线程,或者broadcast放行所有线程。
Condition使用
下面程序,表示A,B,C三个售票员分别售票。但是B和C售票员,只有当A出售完20张票以后,才能出售票。
#include <OpenThreads/Thread>
#include <OpenThreads/Atomic>
#include <OpenThreads/Condition>
#include <OpenThreads/ScopedLock>
#include <iostream>
#include <string>
OpenThreads::Atomic g_ticketCounts(150);
OpenThreads::Mutex g_ticketSellMutex;
OpenThreads::Condition g_condition;
class TicketSellThread : public OpenThreads::Thread
{
public:
TicketSellThread(const std::string& threadName) : _name(threadName){}
virtual void run()
{
if (_name != std::string("A") ) //不是A售票员,则开始不允许售票。
{
OpenThreads::ScopedLock<OpenThreads::Mutex> mutlock(g_ticketSellMutex);
g_condition.wait(&g_ticketSellMutex);
}
for (int i = 0; i < 50; i++)
{
//当A卖出20张票后,其他售票员才可以售票
if ( (i == 20) && (_name == std::string("A") ) )
{
g_condition.broadcast();
}
std::cout << _name << " sell " << --g_ticketCounts << std::endl;
}
}
private:
std::string _name;
};
int main(int argc, char** argv)
{
TicketSellThread ticketSellThreadA("A");
ticketSellThreadA.start();
TicketSellThread ticketSellThreadB("B");
ticketSellThreadB.start();
TicketSellThread ticketSellThreadC("C");
ticketSellThreadC.start();
while(ticketSellThreadA.isRunning())
OpenThreads::Thread::YieldCurrentThread();
while(ticketSellThreadB.isRunning())
OpenThreads::Thread::YieldCurrentThread();
while(ticketSellThreadC.isRunning())
OpenThreads::Thread::YieldCurrentThread();
return 0;
}