【发布时间】: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,会不会导致什么问题呢?
【问题讨论】: