但是,基于posix的pthread锁不允许这样的行为。
是否有任何编译时宏或任何可以使windows互斥量与pthread互斥锁行为相同的设置?
答案 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)