簡體   English   中英

c ++跨線程池實現取消

[英]c++ implementing cancel across thread pools

我有幾個線程池,我希望我的應用程序處理取消操作。

為此,我實現了一個共享操作控制器對象,我在每個被調用的線程池工作器函數中的各個位置進行輪詢。

這是一個很好的模型,還是有更好的方法呢?

我只是擔心在整個代碼中散布所有這些operationController.checkState()。

是的,這是一個很好的方法。 Herb Sutter有一篇很好的文章將它與替代品(更糟糕的)相比較。

通過任何類型的異步取消,您將不得不定期輪詢某種標志。 必須將事物保持在一個共同狀態是一個根本問題。 如果你只是在它正在做的事情中間殺死一個線程,遲早會發生壞事。

根據您實際執行的操作,您可以忽略操作的結果而不是取消它。 您讓操作繼續,但不要等待它完成,不要檢查結果。

如果你真的需要停止操作,那么你將不得不在適當的點進行輪詢,並做必要的清理工作。

這是一個很好的方法。

另一種可能的方法是,如果有一些其他子程序[s],線程仍然會定期調用,檢查該子程序並拋出異常(被捕獲在線程的頂部),假設“取消”可能被認為是例外,並假設線程執行的代碼是異常安全的。

我不會這樣做,檢查共享對象。

我很可能會為每個線程對象提供一種取消自己線程內執行的方法,無論是事件,線程安全狀態變量還是其他什么。

共享操作控制器的問題在於,從我的觀點來看,邏輯是相反的,當它不控制任何東西時,為什么稱它為“控制器”?

對我來說,操作控制器應該重新獲得取消訂單,然后選擇適當的線程並發出信號停止。 如果你知道我的意思,那將是一個正確的“指揮鏈”。 你這樣做的方法就是在線程中引入一種不自然的行為,而不是“服從”命令停止,而是每次檢查他的“上司”是否“寫了一些訂單”。 不知何故,它感覺不對勁。

另外,如果你將來只停留一些“部分”線程怎么辦? 如果你想包含一些高級邏輯以便線程只在條件下停止怎么辦? 然后你將不得不重寫每個線程中的代碼來處理這個條件。

因此,我將為每個線程提供一種方法,以便能夠處理信號,例如使用具有FIFO結構的命令模式

(順便說一句,我意識到他們是線程池工作者,而不是實際的線程類,但我認為每個工作者必須被發信號分別停止,而不是相反)。

在類似的情況下,我使用了一個事件,非自動重置,所有線程都可以查看該事件。 與輪詢非常相似,除非你的線程有時會阻塞,它們也可以為“停止”事件而休眠。 (在Windows上更容易。)

/ L

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM