如果当前拥有该锁的线程试图获取它,Windows Mutex似乎允许获取的锁再次获取(recursion)。
但是,基于posix的pthread锁不允许这样的行为。
是否有任何编译时的macros或任何设置,可以使Windows互斥体的行为与pthread互斥体一样?
只要你在Windows中编程,避免重新实现其Mutex的行为。 它被同一个线程重入是绝对必要的。
没有线程关联的同步对象是计数为1的信号量。使用CreateSemaphore()。
Fwiw,你很需要这种行为。 这听起来像你正试图在多个地方不适当地使用同一个同步对象。 你可以使用信号量,但是你会失去并发的潜力。 考虑使用多个互斥体代替。
你不能改变Windows互斥量递归的事实。 虽然Posix线程默认情况下不是递归的,但您可以使用带有PTHREAD_MUTEX_RECURSIVE
标志的pthread_mutexattr_settype()
来创建一个。
在Windows中锁定互斥锁实际上是相当昂贵的操作,并且最适合于进程间同步。 对于仅在单个进程中使用的互斥锁,通常使用关键部分,但是这些部分也是可重入的。 作为nobugz状态,您将需要使用一个信号量,初始化最大计数为1,以获得非递归同步。
一个信号量对象就像一个特殊的计数器,可以在线程之间自动递增和递减(或者如果创建共享,则为进程)。 通过创建一个最大计数为1,您可以获得所需的非递归行为。
我建议使用读/写锁(又名SRW) 。 像Windows Mutex一样,它们不是递归的。 像关键部分一样,它们很轻,如果免费的话,不要调用内核( 基准 )。
看看“快速互斥”下的这篇文章。
这些类型的互斥锁不能被递归获取。
当然,你必须研究如何在C中实现它们