OpenThreads库的使用-Condition

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值