2012-09-04 55 views
3

的情況下,如果不止一個線程在一個信號燈拋出異常,會發生什麼事引發異常。如果多個線程在信號燈

假設一個sempahore可以有10個線程的可以一次輸入和線程#2,5,6,7,9會拋出異常,然後將它不會拋出異常其他線程運行成功或他們得到中止。

是它在某種程度上關係到AggregatedException類。

回答

1

假設其他線程已經在內部信號發生異常時,他們將成功地完成運行。如果你希望他們提前終止,使用帶有cancellation token一個SemaphoreSlim對象。

+0

因此,這意味着,如果10個併發線程之間假設它們中的一些可能會遇到「除以零」,那麼我應該取消所有其他沒有遇到任何異常的線程。是這樣嗎 ? +1爲您的觀點。 –

+0

@AbhishekGupta不,這意味着你*可以*如果你想早點取消其他線索。但你不必這樣做。 –

0

我不明白你的意思了由

拋出異常的信號

,但可能

釋放信號

之前拋出異常在這種情況下gro中的其他線程最多10人將完成並沒有問題。 如果之後有其他線程進入,由於缺少許可證,它們可能會死鎖。

在任何情況下,信號量,鎖等應當以finally塊,以防止上述被釋放,根據下面的方案:

acquire 
try 
{ 
    risky code 
} 
finally 
{ 
    release 
} 
+0

這假定信號燈保護任何資源(S)將在一個合理的狀態由被拋出異常的線程離開 - 這一般不能是一個安全的假設。 –

+0

@Damien_The_Unbeliever:不,當然不是。我只是展示瞭如何確保信號量在任何情況下都被釋放。 OP可以在其上實施其他安全網。 – Tudor