如何改变Windows Mutex的递归锁定行为?

Jay*_*Jay 7 c windows posix mutex

如果当前拥有锁的线程试图获取它,Windows Mutex似乎允许再次(递归地)获取获取的锁.

但是,基于posix的pthread锁不允许这样的行为.

是否有任何编译时宏或任何可以使windows互斥量与pthread互斥量相同的设置?

Han*_*ant 8

只要您在Windows中编程,就可以避免重新实现其互斥锁的行为.它被同一个线程重入对于其定义的行为是绝对必要的.

没有线程关联的同步对象是一个计数为1的信号量.使用CreateSemaphore().

Fwiw,你很需要这种行为.听起来你试图在不同的地方使用相同的同步对象.您可以使用信号量,但您将失去并发潜力.考虑使用多个互斥锁.


gav*_*inb 8

您无法改变Windows Mutexes是递归的这一事实.虽然POSIX线程不递归默认情况下,你可以使用pthread_mutexattr_settype()PTHREAD_MUTEX_RECURSIVE标志做出一个如此.

在Windows中锁定互斥锁实际上是一项非常昂贵的操作,最适合进程间同步.对于仅在单个进程中使用的互斥锁,通常使用临界区,但这些也是可重入的.正如nobugz所说,你需要使用一个信号量,初始化最大计数为1,以获得非递归同步.

信号量对象就像一个特殊的计数器,它可以跨线程(或进程,如果创建共享)以原子方式递增和递减.通过创建一个最大计数为1的数据,您将获得所需的非递归行为.