代码之家  ›  专栏  ›  技术社区  ›  Jay

如何改变Windows互斥体的递归锁定行为?

  •  7
  • Jay  · 技术社区  · 15 年前

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

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

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

    4 回复  |  直到 8 年前
        1
  •  8
  •   Hans Passant    15 年前

    只要在Windows中编程,就不要重新实现互斥体的行为。同一线程的可重入性对于其定义的行为是绝对必要的。

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

    我很好奇你需要这种行为。听起来您试图在多个地方不适当地使用同一个同步对象。您可以使用信号量,但是您将失去并发性的潜力。考虑使用多个互斥体。

        2
  •  7
  •   gavinb    15 年前

    不能更改Windows互斥锁是递归的事实。虽然POSIX线程在默认情况下不是递归的,但是 可以 使用 pthread_mutexattr_settype() PTHREAD_MUTEX_RECURSIVE 做一个这样的标记。

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

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

        3
  •  2
  •   Jérôme Pouiller    11 年前

    我建议使用 Read/Write locks (aka SRW) . 与Windows互斥体一样,它们不是递归的。和关键部分一样,它们很轻,如果它们是自由的,就不会调用内核。( Benchmarks )

        4
  •  0
  •   chwarr Tamas Hegedus    8 年前

    看看下面这篇文章 'fast mutex' .

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

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