OpenThreadsライブラリの使用-Condition

3726 ワード

Conditionの概要
条件変数.条件が満たされない場合、スレッドはブロックされます.条件が満たされると、スレッドが実行されます.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;
}