天天看點

三個線程順序列印ABC

我通過使用OpenThreads庫的BlockCount類,實作順序列印ABC,代碼如下。

#include <OpenThreads/Thread>
#include <OpenThreads/Block>
#include <string>
#include <iostream>
#include <vector>

class PrintThread : public OpenThreads::Thread
{
public:
    PrintThread(const std::string& name) : _name(name){}

    void run()
    {
        for (int i = ; i < ; i++)
        {
            _selfBlock->block();    //自我阻塞

            std::cout << _name << std::endl;

            //釋放其他線程
            for (std::vector<OpenThreads::BlockCount*>::iterator it = _releaseBlocks.begin(); 
            it != _releaseBlocks.end(); ++it)
            {
                (*it)->completed();
            }

            //重置自身
            //有多少個要釋放,就需要等待多少個
            _selfBlock->setBlockCount(_releaseBlocks.size());   
            _selfBlock->reset();
        }
    }

    void setSelfBlock(OpenThreads::BlockCount* block)
    {
        _selfBlock = block;
    }

    void addReleaseBlock(OpenThreads::BlockCount* block)
    {
        _releaseBlocks.push_back(block);
    }
private:
    std::string _name;
    OpenThreads::BlockCount* _selfBlock;
    std::vector<OpenThreads::BlockCount*> _releaseBlocks;
};

int main(int argc, char** argv)
{
    OpenThreads::BlockCount blockA();  //A最先列印,阻塞數為0
    OpenThreads::BlockCount blockB();  //B接着列印,阻塞數為1
    OpenThreads::BlockCount blockC();  //C最後列印,等A和B列印完了再列印
    blockA.reset();
    blockB.reset();
    blockC.reset();

    PrintThread a("A");
    a.setSelfBlock(&blockA);
    a.addReleaseBlock(&blockB);
    a.addReleaseBlock(&blockC);

    PrintThread b("B");
    b.setSelfBlock(&blockB);
    b.addReleaseBlock(&blockC); //B的列印,下一個是C,是以先添加C
    b.addReleaseBlock(&blockA);

    PrintThread c("C");
    c.setSelfBlock(&blockC);
    c.addReleaseBlock(&blockA);
    c.addReleaseBlock(&blockB);

    a.start();
    b.start();
    c.start();

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

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

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

    return ;
}
           

使用一個PrintThread類,來列印自身的名字10次。建立了3個PrintThread類的對象,分别列印“A”“B”“C”。

在每次列印自身之前,都使用自己的BlockCount阻塞自己。列印完自身之後,都釋放其他兩個BlockCount。

初始時,A的BlockCount為0,B的BlockCount為1,C的BlockCount為2。

繼續閱讀