2014-05-01 101 views
0

我寫了一個簡單的作業隊列,它使用一個線程逐個運行隊列中的作業。線程本身來自池,所以只要作業隊列對象在其周圍,它的生命週期就會持續。作業從隊列中彈出,然後在作業上調用run(),並在完成後放棄。在線程上處理作業取消的最佳方法

我想知道什麼樣的範例可以用來在中途中止工作。天真的做法是定期檢查一箇中止標誌。問題是由於I/O阻塞或其他一些計算繁重的任務,一些工作需要一段時間。

我認爲的另一個選擇是完全殺死線程。這是一個潛在的骯髒和錯誤的解決方案。

還有其他的方法嗎?

編輯:由於我在C++土地,有沒有辦法注入異常到另一個線程?它會立即中斷執行並返回到主線程。我認爲這將是理想的。

+0

如果你真的沒有看到使用「* flag」* - 類似上面提到的任何可能性,請查看'pthread_cancel()'。 – alk

+0

或者只是使用標誌解決方案,或者運行一個可以殺死的單獨進程。殺死一個線程是一個糟糕的主意。請參閱http://www.drdobbs.com/parallel/interrupt-politely/207100682 –

+0

@alk:AFAIK,使用'pthread_cancel()'也會導致線程本身退出。我試圖避免這一點。基本上,我想要一種方法來取消正在運行的作業,以便可以使用乾淨的作業隊列。一種方法是重新創建線程。 – MarkP

回答

0

取決於您使用的線程的實現,可能有不同的方式來操縱「中止標誌」。我會提供看向boost.threads & boost.interruption_points。 UPD:在線程中注入異常(如果它位於interruption_point中),如您所願。但是,如果你有很大的不可分割的大量計算塊,那麼,我相信,在思想上它必須完成。想一想,如果你看到任何可以阻止它的「時刻」,在這個區塊內部,那麼你可以將這個區塊分成幾部分,在那裏插入「中止標誌」。 所以,如果是單塊,就不可能有這樣的時刻。所以你不能中斷計算正常的方式。所以你必須等待他們的完成。

但是你可以避免等待問題,如果你將計算你的重塊不是分開的線程,而是分開的過程。然後你可以殺死它,而不用擔心弄髒你的主進程內存,如果需要的話,你甚至可以讓它在幾分鐘前關閉你的主進程之後計算它需要幾個小時的時間,然後靜靜地死掉,如果需要的話。沒問題。

相關問題