三个线程顺序打印ABC

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

    推荐阅读