回答
在1.33中快速瀏覽boost.thread的文檔表明,沒有便捷的方法來實現中斷。在1.35中引入了線程中斷(對於其中一個「中斷點」中的線程)。
因此,我能想到的唯一選擇是使用信號(它不在1.33中,因此您需要回退,例如pthread),並結合任何方法的超時那是阻塞的。基本上使用信號來喚醒睡眠中的線程,讓它們睡眠等待信號,並在阻塞線程時超時以喚醒它們並檢查它們是否應該退出。不幸的是,這是一個非常不理想的解決方案,並且在某種程度上等於內部無論如何都需要更新版本的boost。
如果您使用的是boost.thread,那麼您應該考慮升級到其他項目的更新版本,因爲1.33不支持絕大多數對於多線程至關重要的構造。
無法在boost :: thread中中斷阻塞的線程。你需要自己實現正確的線程中斷,例如使用boost :: conditional。 AFAIK任何現有的中斷正在運行的線程的方法(例如Windows API中的TerminateThread)只會導致問題(內存泄漏其中之一)。
我同意begray,看看情況變量。如果你有不時想起牀的線索,那麼它們就是你希望使用的東西。如果您希望線程阻塞其他呼叫(例如調用BSD套接字或類似的東西),這不會對您有所幫助。您需要直接使用這些調用的超時設施(如果存在)。
下面是一個示例,僅使用boost 1.33.1中提供的工具。我沒有編譯它,所以可能會有小錯誤。我已經包含了一個模糊的Work類的使用,但是您根本不需要使用共享數據來使用這種模式。只需要互斥體和條件變量。
Work work;
boost::condition workAvailable;
boost::mutex workMutex;
void Producer()
{
{
boost::mutex::scoped_lock lock(workMutex);
UpdateWork(work);
workAvailable.notify_one();
}
boost::mutex::scoped_lock lock(workMutex);
work.SetOver();
workAvailable.notify_one();
}
void Consumer()
{
//This thread uses data protected by the work mutex
boost::mutex::scoped_lock lock(workMutex);
while(true)
{
//this call releases the work mutex
//when this thread is notified, the mutex is re-acquired
workAvailable.wait(lock);
//once we have the mutex we can work with shared data
//which might require this thread to terminate
if(work.Over())
{
return;
}
DoWork(work);
}
}
生產者線程將創建一個工作單元,然後阻止。消費者線程將完成工作,然後阻止。然後生產者線程將設置終止條件並退出。消費者然後將退出。
我剛剛注意到有關阻止傳統呼叫的評論,他認爲這是他的核心問題。這絕對無助於回答原來的問題。我不知道在boost 1.33.1中是否有安全的方式來終止阻塞呼叫。如果傳統調用是異常安全的,則後續版本的boost可以提供幫助。 我考慮刪除這個,但我會在這裏留下,因爲答案可能對OP以外的人有用。 – 2009-12-14 22:22:29
- 1. 中斷分離的boost ::線程
- 2. 當qt崩潰時,boost線程中斷
- 3. 線程中斷()不會中斷線程
- 4. boost線程池
- 5. Boost多線程
- 6. 在boost線程中運行boost asio io_service
- 7. 中斷線程
- 8. 線程中斷
- 9. 當跨越DLL邊界時,Boost線程中斷不起作用
- 10. 從另一個線程中斷boost :: asio :: async_receive_from
- 11. 獲取對當前boost :: thread /中斷主線程的引用
- 12. 的boost ::類中的線程
- 13. Boost線程禁用
- 14. 鏈接boost ::線程
- 15. Boost線程同步
- 16. Boost線程取消
- 17. 線程和中斷
- 18. SwingWorker中斷線程
- 19. Java - 中斷線程?
- 20. Boost線程終止程序?
- 21. boost異步套接字和boost ::線程
- 22. C++ //將Boost :: array傳遞給Boost ::線程
- 23. boost :: shared_mutex vs boost :: mutex多線程寫入?
- 24. Boost可選Boost線程編譯問題
- 25. 的boost ::線程 - 線程創建問題
- 26. Boost線程不調用線程函數
- 27. boost :: asio,線程池和線程監視
- 28. 基於線程ID的中斷線程
- 29. java線程中斷,線程爲空
- 30. 禁用中斷時中斷boost :: thread
爲什麼它睡覺/被阻擋?如果你需要能夠根據需要喚醒它,讓它等待一個條件變量或互斥鎖或其他東西是否更有意義? – jalf 2009-12-14 14:06:10
如果您可以建議更好的解決方案,我試圖給某段代碼添加超時: 我有一個阻塞調用,接收新數據並將其保存爲最新的數據。這個數據有一個使用期限,當它到期時我需要觸發一個事件*除非我在此期間收到新數據,在這種情況下,我會將超時重新初始化爲新的壽命並再次等待。 – James 2009-12-14 14:59:58
是您需要的阻塞調用不可變的遺留代碼還是可以將其更改爲非阻塞/超時? – 2009-12-14 15:07:43