2016-04-07 59 views
0

這不是涉及捕獲從另一個線程拋出的異常的任何問題的重複。將異常拋出到另一個線程中

我有代碼產生一個線程,它熄滅,並做它自己的事情。

在未來的某個時間點,我希望能夠拋出其他線程中的兩個異常中的一個(即terminateinterrupt)。

這樣做的一種方法是讓變量共享並讓其他線程定期檢查它是否應該被終止。我的首選是沒有它檢查的約束(某些代碼將獨立於執行線程的庫,並且不會被寫入檢查)。

在我理想的解決方案,你可能最終在一個情況下,調試,你可能會發現,auto i = 1 + 1拋出一個異常,因爲另一個線程告訴你的線程拋出,這就是你剛纔發生是對在該行時間。

有沒有一種方法可以做到這一點?

+0

這真的只是沒有道理說實話。 C++的異常機制基本上圍繞着展開發生異常的上下文的堆棧來組織。也許你可以嘗試解釋你想用這個機制解決的問題,你會得到明智的解決方法。通常的答案是這樣的:「如果你發現你需要從外面伸手去做一個正確的事情,那就意味着你爲那個線程編寫了錯誤的代碼。爲什麼它沒有被編碼來做正確的事情呢? ?所有線程*必須*合作。「 –

+0

在理想的世界裏,是的,@DavidSchwartz,他們會的。但是,如果一個線程正在等待某個API(例如InfiniBand)返回並且它永遠不會這樣做,那麼所有廣告*應該*進行合作並不重要:它們不會。假設你永遠處於這樣一個天真的位置。 – iAdjunct

+0

確實有處理這種情況的工具,但是跨線程異常不是它們。如果API支持中斷,則只需使用它支持的中斷。如果它不支持中斷,那麼中斷將不是解決方案。否則,您必須使用其他工具,例如使用包裝將API隔離到其自己的進程。 –

回答

1

我不認爲在線程B中有一個異常在線程B中被捕獲,因爲異常的中心概念是堆棧的展開,並且線程A的堆棧與線程B的堆棧不同。

你可以做的是在線程A中拋出異常,在線程A中有一個異常處理程序捕獲異常並以某種方式通過線程B處理相關細節來處理它,以及當線程B收到通知時可以作出響應拋出它自己的異常,類似於線程A中最初拋出的異常。

至於如何實現通知和數據傳輸,可以使用任何通常的跨線程通知/通信機制(共享原子變量和輪詢,socketpair,管道,互斥保護的FIFO消息隊列等)。

在我理想的解決方案,你可以在一個情況下,調試, 你可能會發現,自動I = 1 + 1,因爲另一個 線程告訴你的線程拋出拋出一個異常結束,這就是行了你剛剛發生 在當時。

我認爲這被稱爲異步異常,我認爲它不被標準C++支持。微軟有他們的structured exception handling(SEH)這樣做,但這是一個專有/非標準功能。

+0

除了最後一段,我想你完全錯過了這一點。 *有許多方法可以將某個線索從另一個線索傳遞到另一個線索 - 如果另一個線索正在收聽。但是如果另一個線程沒有在監聽(因爲有人寫了一個阻止某事而不等待的API),那並不重要。關鍵是不要在一個線程中拋出異常並將其捕獲到另一個線程中:它將線程注入另一個線程。 – iAdjunct

+0

將我的答案改爲「不,這不可能」更好嗎? (順便說一句,問題的標題是「拋出一個異常到另一個線程」,這聽起來非常像「拋出一個異常在一個線程中,並抓住另一個」給我) –

+0

聽起來像它,但不是真的。一個是拋出異常(),然後在另一個線程中捕獲。另一個是'otherThreadObject.throwException ()' – iAdjunct

相關問題