我通过使用OpenThreads库的BlockCount类,实现顺序打印ABC,代码如下。
#include
#include
#include
#include
#include class PrintThread : public OpenThreads::Thread
{
public:
PrintThread(const std::string& name) : _name(name){}void run()
{
for (int i = 0;
i < 10;
i++)
{
_selfBlock->block();
//自我阻塞std::cout << _name << std::endl;
//释放其他线程
for (std::vector::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 _releaseBlocks;
};
int main(int argc, char** argv)
{
OpenThreads::BlockCount blockA(0);
//A最先打印,阻塞数为0
OpenThreads::BlockCount blockB(1);
//B接着打印,阻塞数为1
OpenThreads::BlockCount blockC(2);
//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 0;
}
【三个线程顺序打印ABC】使用一个PrintThread类,来打印自身的名字10次。建立了3个PrintThread类的对象,分别打印“A”“B”“C”。
在每次打印自身之前,都使用自己的BlockCount阻塞自己。打印完自身之后,都释放其他两个BlockCount。
初始时,A的BlockCount为0,B的BlockCount为1,C的BlockCount为2。