【问题标题】:Is it possible to do static initialization of mutexes in Windows?是否可以在 Windows 中对互斥锁进行静态初始化?
【发布时间】:2010-08-24 11:18:32
【问题描述】:

pthread 支持使用 PTHREAD_MUTEX_INITIALIZER 对 pthread_mutex_t 进行静态初始化。

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

【问题讨论】:

    标签: windows pthreads mutex


    【解决方案1】:

    是的,这可以通过几行代码来实现。这是 pthread 兼容互斥操作的一个端口,包括您想要的静态初始化程序 MUTEX_INITIALIZER:

    #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-body,那么只有一个线程成功初始化了锁。请注意,静态锁的生命周期不需要 CloseHandle()。

    【讨论】:

      【解决方案2】:

      不,因为 Windows 互斥锁是句柄,它们必须用 CreateMutex() 初始化。

      请注意,使用PTHREAD_MUTEX_INITIALIZER 对pthread_mutex_t 的静态初始化并不是真正的初始化,它会在第一次调用pthread_mutex_lock()pthread_mutex_trylock() 时在内部完成

      【讨论】:

      • 是的。但是,如果我使用 PTHREAD_MUTEX_INITIALIZER 初始化一个互斥锁并且两个线程并行调用 pthread_mutex_lock,会不会导致任何问题?
      • 不确定,但由于 pthread_mutex_lock 是线程安全的,所以应该没问题
      猜你喜欢
      • 2011-07-05
      • 2015-05-31
      • 2013-01-15
      • 1970-01-01
      • 1970-01-01
      • 2017-06-19
      • 1970-01-01
      • 2021-07-24
      • 1970-01-01
      相关资源
      最近更新 更多