递归(可重入)互斥量如何工作?

时间:2013-04-08 23:42:18

标签: multithreading thread-safety mutex recursive-mutex

我在http://preshing.com/20120305/implementing-a-recursive-mutex以及http://en.wikipedia.org/wiki/Reentrant_mutex上阅读了两篇关于递归(reentrant)互斥的文章,但这两篇文章都没有任何意义。

有人可以解释递归(可重入)互斥的工作原理吗?

(我发现很少有材料解释递归互斥的工作原理。如果有人有好的解释,我会关闭这个问题。)

谢谢!

1 个答案:

答案 0 :(得分:1)

一种简单的方法是将标准互斥锁与以下辅助信息配对:

  • 指向拥有互斥锁的线程的指针(如果未获取,则为NULL),
  • 一个计数器,最初为0。

然后,您可以通过以下方式获取互斥锁:

  • 如果您是当前的互斥锁拥有者,请递增计数器并立即返回。
  • 如果没有,请获取互斥锁并将计数器设置为0.

换句话说,如果您已拥有互斥锁,则只需增加一个计数器,表示您现在拥有它甚至更多。如果没有,您可以像往常一样获取互斥锁。

然后您可以通过以下方式释放互斥锁:

  • 如果计数器非零,则递减计数器并立即返回。
  • 否则,请释放互斥锁。

为了使其工作,您需要能够以线程安全的方式读取计数器和互斥锁所有者。您可以通过使用辅助互斥锁来保护它,或者通过标记计数器/所有者volatile来执行此操作。

希望这有帮助!