首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Windows中可以进行互斥的静态初始化吗?

在Windows中可以进行互斥的静态初始化吗?
EN

Stack Overflow用户
提问于 2010-08-24 19:18:33
回答 2查看 2.9K关注 0票数 6

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-08-24 19:28:32

不,因为Windows mutex是句柄,所以它们必须用CreateMutex()初始化。

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

票数 2
EN

Stack Overflow用户

发布于 2012-02-29 05:36:03

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

代码语言:javascript
复制
#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()。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3555859

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档