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

可以在Windows中静态初始化互斥锁吗?

  •  6
  • Jay  · 技术社区  · 14 年前

    pthread支持使用pthread\u mutex\u初始化器静态初始化pthread\u mutex\t。

    是否可以使用Windows互斥体实现类似的互斥体初始化静态机制?

    2 回复  |  直到 14 年前
        1
  •  2
  •   CharlesB Craig McQueen    14 年前

    不,因为Windows mutex是句柄,所以必须用 CreateMutex() .

    请注意,pthread\u mutex\t的静态初始化使用 PTHREAD_MUTEX_INITIALIZER 不是真正的初始化,它将在第一次调用 pthread_mutex_lock() pthread_mutex_trylock()

        2
  •  8
  •   Dr. Alex RE    10 年前

    是的,只需几行代码就可以实现。这是一个与pthread兼容的mutex操作端口,包括您想要的静态初始值设定项mutex\u初始值设定项:

    #define MUTEX_TYPE             HANDLE
    #define MUTEX_INITIALIZER      NULL
    #define MUTEX_SETUP(x)         (x) = CreateMutex(NULL, FALSE, NULL)
    #define MUTEX_CLEANUP(x)       (CloseHandle(x) == 0)
    #define MUTEX_LOCK(x)          emulate_pthread_mutex_lock(&(x))
    #define MUTEX_UNLOCK(x)        (ReleaseMutex(x) == 0)
    
    int emulate_pthread_mutex_lock(volatile MUTEX_TYPE *mx)
    { if (*mx == NULL) /* static initializer? */
      { HANDLE p = CreateMutex(NULL, FALSE, NULL);
        if (InterlockedCompareExchangePointer((PVOID*)mx, (PVOID)p, NULL) != NULL)
          CloseHandle(p);
      }
      return WaitForSingleObject(*mx, INFINITE) == WAIT_FAILED;
    }
    

    基本上,您希望在第一次使用锁时以原子方式进行初始化。如果两个线程进入If主体,则只有一个线程成功初始化锁。请注意,在静态锁的生存期内不需要CloseHandle()。