2010-11-08 80 views
1

所以我有一些主要功能。每秒24次打開一個帶有功能的助推線程A。該函數將帶有數據的緩衝區。它啓動一個升壓計時器。它打開另一個線程B帶有一個函數發送緩衝區。我需要線程A來殺死線程B,如果它執行方式2長。當然,如果線程B在時間上執行了,我不需要殺死它,它應該會自行終止。什麼推動功能可以幫助我殺死創建的線程(不加入 - 停止/殺死或類似的東西)?Boost,C++如何殺死由另一個線程打開的線程?

順便說一句我不能影響函數的速度我在線程B中執行這就是爲什麼我需要能夠在需要時進行處理。

回答

4

您正在尋找的術語是「取消」,如pthread_cancel(3)。取消操作很麻煩,因爲取消的線程可能不會執行C++析構函數或釋放鎖定......但是,不確定性實際上是更差比確定性的否。

因此,升壓線程不支持取消(例如,請參閱this older question),但它們確實支持interruption,您可能會彎曲以適應此問題。中斷通過常規的C++異常工作,因此它具有可預測的語義。

5

有沒有乾淨的方式殺死一個線程,所以如果你需要做這樣的事情,你乾淨的選擇要麼使用包含一些取消功能的功能,要麼使用一個單獨的進程,因爲你可以使用乾淨地殺死一個進程。

除此之外,我的直接反應是,不是「打開」(你的意思是創建?)線程A每秒24次,你最好用線程A讀一個緩衝區,將它發送到線程B,然後睡覺,直到準備好讀取另一個緩衝區。創建和殺死線程並不是很昂貴,但是以24(或者顯然,48)的速度來執行它會讓我感到有點過度。

2

請不要隨意殺死線程,除非你完全控制它們的執行(然後只是適當的信號讓線程正常退出)。你永遠不知道其他線程是否在某個你從未聽說過的庫的關鍵部分,然後你的程序最終會停在那個CS上,因爲它從來沒有退出或類似的東西。