如果当前拥有锁的线程试图获取它,Windows Mutex 似乎允许再次(递归)获取已获取的锁。
但是,基于 posix 的 pthread 锁不允许这样的行为。
是否有任何编译时宏或任何设置可以使 Windows 互斥体的行为方式与 pthread 互斥体相同?
最佳答案
您无法改变 Windows 互斥锁是递归的事实。虽然默认情况下 Posix 线程不是递归的,但您可以使用 pthread_mutexattr_settype()
使用 PTHREAD_MUTEX_RECURSIVE
标志来实现这一点。
在 Windows 中锁定互斥量实际上是一项非常昂贵的操作,最适合进程间同步。对于仅在单个进程中使用的互斥量,通常使用临界区,但这些也是可重入的。正如 nobugz 所述,您需要使用信号量(最大计数为 1)来获得非递归同步。
信号量对象就像一个特殊的计数器,可以跨线程(或进程,如果创建共享)以原子方式递增和递减。通过创建一个最大计数为 1 的对象,您可以获得所需的非递归行为。
关于c - 如何改变 Windows Mutex 的递归锁定行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1988324/