只要您在Windows中编程,就可以避免重新实现其互斥锁的行为.它被同一个线程重入对于其定义的行为是绝对必要的.
没有线程关联的同步对象是一个计数为1的信号量.使用CreateSemaphore().
Fwiw,你很需要这种行为.听起来你试图在不同的地方使用相同的同步对象.您可以使用信号量,但您将失去并发潜力.考虑使用多个互斥锁.
您无法改变Windows Mutexes是递归的这一事实.虽然POSIX线程不递归默认情况下,你可以使用pthread_mutexattr_settype()
与PTHREAD_MUTEX_RECURSIVE
标志做出一个如此.
在Windows中锁定互斥锁实际上是一项非常昂贵的操作,最适合进程间同步.对于仅在单个进程中使用的互斥锁,通常使用临界区,但这些也是可重入的.正如nobugz所说,你需要使用一个信号量,初始化最大计数为1,以获得非递归同步.
信号量对象就像一个特殊的计数器,它可以跨线程(或进程,如果创建共享)以原子方式递增和递减.通过创建一个最大计数为1的数据,您将获得所需的非递归行为.