OpenThreadsライブラリの使用-Condition
3726 ワード
Conditionの概要
条件変数.条件が満たされない場合、スレッドはブロックされます.条件が満たされると、スレッドが実行されます.OpenThreadsライブラリのConditionは、Mutexに依存して実行する必要があります.条件が満たされていない場合は、Conditionのwait関数を呼び出し、条件を待ちます.条件が満たされた場合、Conditionのsignalを呼び出してスレッドを1つ、またはbroadcastを呼び出してすべてのスレッドを実行します.
条件使用
次の手順では、A、B、Cの3人の切符売りがそれぞれ切符を売っていることを示します.しかし、BとCの切符売りは、Aが20枚の切符を販売してからしか切符を出すことができない.
条件変数.条件が満たされない場合、スレッドはブロックされます.条件が満たされると、スレッドが実行されます.OpenThreadsライブラリのConditionは、Mutexに依存して実行する必要があります.条件が満たされていない場合は、Conditionのwait関数を呼び出し、条件を待ちます.条件が満たされた場合、Conditionのsignalを呼び出してスレッドを1つ、またはbroadcastを呼び出してすべてのスレッドを実行します.
条件使用
次の手順では、A、B、Cの3人の切符売りがそれぞれ切符を売っていることを示します.しかし、BとCの切符売りは、Aが20枚の切符を販売してからしか切符を出すことができない.
#include
#include
#include
#include
#include
#include
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<: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;
}