2012-09-04 56 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