有多個線程在任務上工作。一旦線程成功,所有的線程都應該取消,因爲工作已經完成。一旦一個線程成功終止,我怎樣才能取消其他線程?誰將調用pthread_cancel()
以及成功的線程將如何告知main
或產生它的線程(返回值?)。完成常見工作後取消POSIX線程
UPDATE
我不想簡單地調用exit
就像我現在想要一些控制。例如,在取消線程之後,我將通過成功的線程處理找到的結果,並且可能會執行一些更多的處理,或者只是想讓該進程繼續運行以進行更多的工作。
有多個線程在任務上工作。一旦線程成功,所有的線程都應該取消,因爲工作已經完成。一旦一個線程成功終止,我怎樣才能取消其他線程?誰將調用pthread_cancel()
以及成功的線程將如何告知main
或產生它的線程(返回值?)。完成常見工作後取消POSIX線程
UPDATE
我不想簡單地調用exit
就像我現在想要一些控制。例如,在取消線程之後,我將通過成功的線程處理找到的結果,並且可能會執行一些更多的處理,或者只是想讓該進程繼續運行以進行更多的工作。
你可以選擇一個簡單的方案,其中主要做的一切。
已有main
啓動所有線程,並在某些信號上執行down
。當一個線程完成任務時,在該信號量上執行一個up
。當main被解鎖時,它可以pthread_cancel
所有的線程(然後pthread_join
來確認)。
這樣main
啓動和停止所有線程所以它應該是相當簡單的。
一個簡單的方法是調用exit()
與所有的線程終止一起的過程。它可以從任何線程調用。
另一種方式是讓你的主線程產卵和等待工作線程,而且一旦工作線程完成或者:
pthread_cancel()
他們。默認情況下,線程是使用PTHREAD_CANCEL_DEFERRED
創建的,這意味着它們在調用任何取消點函數之前不會終止,請參閱Thread Cancellation以獲得較好的說明。所以,如果你的線程正在做一些長時間的計算,你可能想要設置它們的取消狀態爲PTHREAD_CANCEL_ASYNCHRONOUS
立即終止線程,參見pthread_setcanceltype。
爲什麼你需要多個線程來完成這個任務,如果你要扔掉其中一個人所做的工作?只需在一個線程中完成一次工作。 – zwol
說,我有一個巨大的列表線性搜索,我會傳遞列表段到不同的線程,一旦找到匹配,返回。其他人被取消。 – phoxis
我想這是唯一的選擇,但如果你的數據中有任何結構的話,那麼這裏有更好的算法。 – zwol