如果多个线程在使用信号量时抛出异常,会发生什么?

4

如果有多个线程在信号量中抛出异常会发生什么?

假设一个信号量可以同时有10个线程进入,如果线程2、5、6、7、9抛出异常,那么不会抛出异常的其他线程是否能够成功运行,还是它们会被终止。

这与AggregatedException类是否有关系呢?

2个回答

1

假设在异常发生时其他线程已经在信号量中,它们将会成功运行直至完成。如果您想要它们提前终止,请使用一个带有取消令牌SemaphoreSlim对象。


这意味着如果在10个并发线程中有一些遇到了“除以零”的情况,那么我应该取消所有其他没有遇到任何异常的线程。是这样吗?期待您的观点。 - Abhishek Gupta
@AbhishekGupta 不,这意味着如果你想要的话,你可以提前取消其他线程。但你并不需要这样做。 - Daniel Kinsman

1

我不明白你所说的意思是什么:

在信号量中抛出异常

但可能是这样:

在释放信号量之前抛出异常

在这种情况下,组合中的另外10个线程将顺利运行并完成,没有任何问题。如果其他线程随后进入,则由于许可证不足而可能会发生死锁。

无论如何,为了防止上述情况发生,应该在 finally 块中释放信号量、锁等,按照以下方案:

acquire
try
{
    risky code
}
finally
{
    release
}

1
这假设信号量保护的任何资源将被抛出异常的线程以合理的状态留下,这通常不能是一个安全的假设。 - Damien_The_Unbeliever
@Damien_The_Unbeliever:当然不是。我只是在展示如何确保信号量在任何情况下都被释放。OP可以在此基础上实现其他安全措施。 - Tudor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接