天天看点

OpenThreads使用-BarrierBarrier简介Barrier使用

Barrier简介

Barrier,栅栏。

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

Barrier使用

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

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

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

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 = ; i < ; 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();   //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 ;
}