从锁/信号量内调用动作

时间:2015-12-20 07:07:30

标签: multithreading

我有一个接受动作的功能。该函数获取信号量锁(但出于问题的目的,也可以是监视器锁),然后调用该操作。

代码审查员声明并不代表实现线程安全的有效方法,因为它容易受到致命的拥抱。应该封装线程安全的代码,但是你可以通过允许第三方调用外部操作来解决这个问题。 (这就像在锁内发起一个事件。)

忽略封装位,是否存在使用锁定调用操作的特殊情况?我的直觉是说一个动作不会比任何其他代码更容易发生僵局,但在我挑战之前,他是对的吗?

1 个答案:

答案 0 :(得分:0)

获取锁定时调用外部代码的问题是无法保证不再保证代码是死锁安全的。

调用者可以在回调操作中执行任何操作 以下是行动可能执行“危险”的一些示例:

  1. 函数的递归调用。在这种情况下,死锁是可能的。
  2. 执行一些长时间运行的操作。如果他们需要相同的同步对象(监视器或信号量),那么可能会降低其他线程的性能。
  3. 我相信还有其他可能的负面情况。

    监视器(或信号量)的目的是防止同时进入代码部分,这绝对不应该同时运行。对于回调操作,情况并非如此 因此,没有充分的理由在锁内调用动作。

    我建议在此获取锁定之前或释放之后调用回调操作。