【问题标题】:Calling pthread_mutex_init atomically以原子方式调用 pthread_mutex_init
【发布时间】:2014-02-23 12:23:10
【问题描述】:

如果共享访问某个库中的代码,多个线程之间受全局互斥锁保护,当第一次获取互斥锁时,我们需要调用 pthread_mutex_init 但是如果多个线程尝试同时调用库函数,那么我们需要确保 pthread_mutex_init 只被一个线程调用一次。

我们怎样才能做到这一点?库构造函数/析构函数是一种解决方案,但库必须支持所有编译器/平台。我们可以使用计数器并使用原子 inc/dec,但每次锁定/解锁的原子 ++/-- 操作都很昂贵。我正在寻找任何其他方式。所有 cmets 将不胜感激。

【问题讨论】:

    标签: linux multithreading gcc operating-system posix


    【解决方案1】:

    你有两个不错的选择:

    1. 使用PTHREAD_MUTEX_INITIALIZER静态初始化互斥锁。

    2. 使用pthread_once 和静态初始化的pthread_once_t 确保互斥体被初始化一次。

    【讨论】:

    • 谢谢。我会尝试这些选项。
    • pthread_once 可以使用原子比较加上一个锁定/解锁。静态初始化是更好的选择。
    • @Pointer 绝对是。仅仅为了避免必须静态初始化另一个类似的结构而创建和使用静态初始化的结构是非常愚蠢的。
    猜你喜欢
    • 2015-08-13
    • 2010-09-23
    • 1970-01-01
    • 2021-01-31
    • 2014-12-06
    • 2011-06-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多