OpenThreads使用-Barrier

Barrier简介

Barrier,栅栏。
栅栏,用来阻挡线程。栅栏有个栅栏强度,为一个数值,当被阻挡的线程达到栅栏强度时,栅栏被冲破,所有被栅栏阻挡的线程运行。

Barrier使用

Barrier的使用,也比较简单,哪个线程调用Barrier的block函数,哪个线程就被阻挡在栅栏外。当栅栏被冲破之后,又自动恢复栅栏,继续阻挡下一次前来的线程。

#include <OpenThreads/Thread>
#include <OpenThreads/Atomic>
#include <OpenThreads/Barrier>
#include <iostream>
#include <string>

OpenThreads::Atomic g_ticketCounts(200);
OpenThreads::Barrier g_barrier(2);

class TicketSellThread : public OpenThreads::Thread
{
public:
    TicketSellThread(const std::string& threadName) : _name(threadName){}
    virtual void run()
    {
        if (_name != std::string("A") ) //不是A售票员,则开始不允许售票。
        {
            g_barrier.block();
        }
        for (int i = 0; i < 50; i++)
        {
            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();

    OpenThreads::Thread::microSleep(1000000);   //A, B同时售票,但是B被栅栏阻塞在了栅栏之外。

    TicketSellThread ticketSellThreadC("C");    //C来了,B和C同时冲破栅栏,B,C同时开始售票。
    ticketSellThreadC.start();

    TicketSellThread ticketSellThreadD("D");    //D由于栅栏被重新树起来了,又被阻挡在栅栏外
    ticketSellThreadD.start();


    while(ticketSellThreadA.isRunning())
        OpenThreads::Thread::YieldCurrentThread();

    while(ticketSellThreadB.isRunning())
        OpenThreads::Thread::YieldCurrentThread();

    while(ticketSellThreadC.isRunning())
        OpenThreads::Thread::YieldCurrentThread();

    while(ticketSellThreadD.isRunning())
        OpenThreads::Thread::YieldCurrentThread();

    return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值