Windows互斥锁似乎允许当前拥有锁的线程在尝试获取锁时再次获取(递归)。
但是,基于posix的pthread锁不允许这种行为。
是否有任何编译时宏或任何设置可以使Windows互斥锁的行为与pthread互斥锁相同?
您无法改变Windows Mutexes是递归的这一事实。而虽然默认情况下Posix线程不是递归的,但您可以使用pthread_mutexattr_settype()
和PTHREAD_MUTEX_RECURSIVE
标志来使其成为递归。
在Windows中锁定互斥对象实际上是一项相当昂贵的操作,最适合用于进程间同步。对于仅在单个进程内使用的互斥对象,通常使用关键节,但这些也是可重入的。正如nobugz所说,您需要使用一个信号量,初始化为1的最大计数,以获得非递归同步。
信号量对象就像一个特殊的计数器,可以在线程(或进程,如果创建共享)之间原子地增加和减少。通过创建一个最大计数为1的信号量,您可以获得所需的非递归行为。