這不是涉及捕獲從另一個線程拋出的異常的任何問題的重複。將異常拋出到另一個線程中
我有代碼產生一個線程,它熄滅,並做它自己的事情。
在未來的某個時間點,我希望能夠拋出其他線程中的兩個異常中的一個(即terminate
和interrupt
)。
這樣做的一種方法是讓變量共享並讓其他線程定期檢查它是否應該被終止。我的首選是沒有它檢查的約束(某些代碼將獨立於執行線程的庫,並且不會被寫入檢查)。
在我理想的解決方案,你可能最終在一個情況下,調試,你可能會發現,auto i = 1 + 1
拋出一個異常,因爲另一個線程告訴你的線程拋出,這就是你剛纔發生是對在該行時間。
有沒有一種方法可以做到這一點?
這真的只是沒有道理說實話。 C++的異常機制基本上圍繞着展開發生異常的上下文的堆棧來組織。也許你可以嘗試解釋你想用這個機制解決的問題,你會得到明智的解決方法。通常的答案是這樣的:「如果你發現你需要從外面伸手去做一個正確的事情,那就意味着你爲那個線程編寫了錯誤的代碼。爲什麼它沒有被編碼來做正確的事情呢? ?所有線程*必須*合作。「 –
在理想的世界裏,是的,@DavidSchwartz,他們會的。但是,如果一個線程正在等待某個API(例如InfiniBand)返回並且它永遠不會這樣做,那麼所有廣告*應該*進行合作並不重要:它們不會。假設你永遠處於這樣一個天真的位置。 – iAdjunct
確實有處理這種情況的工具,但是跨線程異常不是它們。如果API支持中斷,則只需使用它支持的中斷。如果它不支持中斷,那麼中斷將不是解決方案。否則,您必須使用其他工具,例如使用包裝將API隔離到其自己的進程。 –