以下進程函數從隊列中讀取數據並對其進行處理。 的wait_and_pop
功能執行阻塞呼叫。因此,直到隊列中可以讀取的數據存在,控制纔會繼續前進。阻塞線程中斷
class Context
{
void launch()
{
boost::thread thread1(boost::bind(&Context::push,this));
boost::thread thread2(boost::bind(&Context::process,this));
std::cout<<"Joining Thread1"<<std::endl;
thread1.join();
std::cout<<"Joining Thread2"<<std::endl;
thread2.join();
}
void process()
{
Data data;
while(status)
{
_masterQueue.wait_and_pop(data); //Blocking Call
//Do something with data
}
}
void push()
{
while(status)
{
//Depending on some internal logic, data is generated
_masterQueue.push(data);
}
}
};
status是一個布爾值(在全局範圍內)。這個布爾值默認設置爲true。只有在SIGINT,SIGSESV等信號被捕獲時,它纔會變爲false。在這種情況下,while循環退出並且程序可以安全退出。
bool status = true;
void signalHandler(int signum)
{
std::cout<<"SigNum"<<signum;
status = false;
exit(signum);
}
int main()
{
signal(SIGABRT, signalHandler);
signal(SIGINT, signalHandler);
signal(SIGSEGV, signalHandler);
Context context;
context.launch();
}
,因爲沒有新的數據是由線程2推當信號被拋出,線程1控制是停留在
_masterQueue.wait_and_pop(data);
如何強制此阻塞調用被打斷?
- 是否有可能實現這一點沒有改變wait_and_pop
- 配售超時的內部工作是不是一種選擇,因爲數據可以在隊列曾經在幾個小時或多次第二 到達
- 我是否在接收信號時推送特定類型的數據,例如INT_MAX/INT_MIN,其中過程函數編碼爲識別並退出循環。
退出時線程是否結束?爲什麼解除封鎖? – perencia