我通過使用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。