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

时间:2010-01-01 10:44:44

标签: c windows posix mutex

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

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

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

4 个答案:

答案 0 :(得分:8)

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

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

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

答案 1 :(得分:7)

您无法改变Windows Mutexes是递归的这一事实。虽然默认情况下Posix线程不是递归的,但可以使用带有PTHREAD_MUTEX_RECURSIVE标志的pthread_mutexattr_settype()进行递归。

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

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

答案 2 :(得分:2)

我建议使用Read/Write locks (aka SRW)。与Windows Mutex一样,它们不是递归的。与关键部分一样,它们很轻,如果它们是空闲的,则不会调用内核(Benchmarks)。

答案 3 :(得分:0)

'fast mutex'下查看这篇文章。

无法递归获取这些类型的互斥锁。

当然,你必须研究如何在C中实现它们。