是否应该避免使用PTHREAD_MUTEX_INITIALIZER进行pthread_mutex静态初始化?

时间:2010-08-24 11:08:39

标签: synchronization pthreads

是否存在使用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,它会导致任何问题吗?

1 个答案:

答案 0 :(得分:2)

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