Block简介
Block,障碍物,阻塞。
Block用来暂停一个线程,等待另一个线程来释放它。
线程A通过Block对自身进行阻塞,然后另一个线程B释放障碍物,使得线程A继续运行。
Block使用
block函数:通过调用block函数,阻塞调用线程。带参数的则表示阻塞线程n毫秒以后,自动释放block。
release函数:释放阻塞的线程。
reset函数:重置阻塞。即又重新开始阻塞线程。
set函数:参数为doRelease,为true时,释放阻塞,线程继续运行,否则阻塞线程。
下面这个程序,开启A,B线程,去售票,然后主线程自己阻塞。当A卖完10张票以后,释放Block,主线程继续运行,去开启C线程售票。同时A阻塞自己,停止售票。当B和C都售票完毕后,主线程再释放Block,让A开始售票。
#include <OpenThreads/Thread>
#include <OpenThreads/Atomic>
#include <OpenThreads/Block>
#include <iostream>
#include <string>
OpenThreads::Atomic g_ticketCounts(150);
class TicketSellThread : public OpenThreads::Thread
{
public:
TicketSellThread(const std::string& threadName) : _name(threadName){}
virtual void run()
{
for (int i = 0; i < 50; i++)
{
//A售完10张票后,释放主线程,同时阻塞自己
if ( (i == 10) && (_name == std::string("A")) )
{
_block.release();
_block.reset();
_block.block();
}
std::cout << _name << " sell " << --g_ticketCounts << std::endl;
}
}
void block()
{
_block.block();
}
void release()
{
_block.release();
}
private:
std::string _name;
OpenThreads::Block _block;
};
int main(int argc, char** argv)
{
TicketSellThread ticketSellThreadA("A");
ticketSellThreadA.start();
TicketSellThread ticketSellThreadB("B");
ticketSellThreadB.start();
ticketSellThreadA.block(); //阻塞主进程
TicketSellThread ticketSellThreadC("C");
ticketSellThreadC.start();
while(ticketSellThreadB.isRunning())
OpenThreads::Thread::YieldCurrentThread();
while(ticketSellThreadC.isRunning())
OpenThreads::Thread::YieldCurrentThread();
ticketSellThreadA.release(); //B和C都卖完以后,再释放A
while(ticketSellThreadA.isRunning())
OpenThreads::Thread::YieldCurrentThread();
return 0;
}