【问题标题】:Should pthread_mutex static initialization using PTHREAD_MUTEX_INITIALIZER avoided?是否应该避免使用 PTHREAD_MUTEX_INITIALIZER 进行 pthread_mutex 静态初始化?
【发布时间】:2011-04-03 02:47:30
【问题描述】:

是否存在使用 PTHREAD_MUTEX_INITIALIZER 静态初始化 pthread 互斥锁并直接传递它们以进行锁定的已知问题?

我在一些网站上读到,这不能在所有平台上得到保证,并且在帮助页面中也有以下注释:

注意:使用 PTHREAD_MUTEX_INITIALIZER 初始化互斥锁不会立即初始化互斥锁。相反,在第一次使用时,pthread_mutex_lock() 或 pthread_mutex_trylock() 函数会分支到慢速路径并导致互斥体的初始化。因为互斥锁不仅仅是一个简单的内存对象,并且需要系统分配一些资源,所以尝试在使用 PTHREAD_MUTEX_INITIALER 静态初始化且尚未锁定的互斥锁上调用 pthread_mutex_destroy() 或 pthread_mutex_unlock() 会导致 EINVAL 错误.

那么,如果两个线程在静态初始化之后调用pthread_mutex_lock,会不会导致什么问题呢?

【问题讨论】:

    标签: synchronization pthreads


    【解决方案1】:

    我认为这不是问题。 给定的 POSIX 线程定义了 API,但没有定义实现。如果某些实现选择某种特殊方法,这不是问题。但是应该保证调用 pthread_mutex_lock 的正确行为。

    【讨论】:

      猜你喜欢
      • 2014-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多