2011-08-19 68 views
5

有多個線程在任務上工作。一旦線程成功,所有的線程都應該取消,因爲工作已經完成。一旦一個線程成功終止,我怎樣才能取消其他線程?誰將調用pthread_cancel()以及成功的線程將如何告知main或產生它的線程(返回值?)。完成常見工作後取消POSIX線程

UPDATE

我不想簡單地調用exit就像我現在想要一些控制。例如,在取消線程之後,我將通過成功的線程處理找到的結果,並且可能會執行一些更多的處理,或者只是想讓該進程繼續運行以進行更多的工作。

+0

爲什麼你需要多個線程來完成這個任務,如果你要扔掉其中一個人所做的工作?只需在一個線程中完成一次工作。 – zwol

+2

說,我有一個巨大的列表線性搜索,我會傳遞列表段到不同的線程,一旦找到匹配,返回。其他人被取消。 – phoxis

+0

我想這是唯一的選擇,但如果你的數據中有任何結構的話,那麼這裏有更好的算法。 – zwol

回答

4

你可以選擇一個簡單的方案,其中主要做的一切。

已有main啓動所有線程,並在某些信號上執行down。當一個線程完成任務時,在該信號量上執行一個up。當main被解鎖時,它可以pthread_cancel所有的線程(然後pthread_join來確認)。

這樣main啓動和停止所有線程所以它應該是相當簡單的。

+0

是的,我的設計是一個主要的設計,這是一個好主意。任何事情都可以用信號完成? – phoxis

+0

@phoxis可以肯定的是,你可以使用'pthread_kill'發送一個信號給一個線程。仍然在這個規則中,我覺得它會很混亂(我想不出從信號處理程序中離開線程的簡單方法)。但不要聽我的話,我總是迴避信號。 – cnicutar

+0

在主要產卵孩子的情況下,我喜歡互斥解決方案,我將使用它。當問題是線程正在被遞歸地或隨機地產生而沒有任何共同的父親時,我詢問信號,在這種情況下,信號可以工作。或者還有其他辦法來處理這種隨機產卵的取消? – phoxis

1

一個簡單的方法是調用exit()與所有的線程終止一起的過程。它可以從任何線程調用。

另一種方式是讓你的主線程產卵和等待工作線程,而且一旦工作線程完成或者:

  • 告訴好聽的其他線程終止,等待,直到他們這樣做,或
  • 突然pthread_cancel()他們。默認情況下,線程是使用PTHREAD_CANCEL_DEFERRED創建的,這意味着它們在調用任何取消點函數之前不會終止,請參閱Thread Cancellation以獲得較好的說明。所以,如果你的線程正在做一些長時間的計算,你可能想要設置它們的取消狀態爲PTHREAD_CANCEL_ASYNCHRONOUS立即終止線程,參見pthread_setcanceltype
+0

是的,這是我在發佈之前使用的一種方式,但我現在想要更多的控制。例如,在線程被取消後,我將通過成功的線程處理找到的結果,並可能做一些更多的處理。 – phoxis

+0

看到更新然後:) –

+0

任何事情都可以用信號完成? – phoxis