Open Group有pthread_mutex_lock
,pthread_mutex_trylock
,pthread_mutex_unlock
和位于here的朋友的规范。
该页面列出了四个互斥锁属性值:PTHREAD_MUTEX_NORMAL
,PTHREAD_MUTEX_ERRORCHECK
,PTHREAD_MUTEX_RECURSIVE
和PTHREAD_MUTEX_DEFAULT
。
所有价值是否互相排斥?在Debug配置中,我们是否允许OR
这些值一起使用?例如,我想在Debug中进行完整的错误检查,PTHREAD_MUTEX_ERRORCHECK | PTHREAD_MUTEX_RECURSIVE
是否有效配置?
我问的原因是我发现错误pthread_mutexattr_settype
。我不确定它是否是有效的配置和OS X实现错误;或者如果它的配置无效且预期的标准行为。如果它是OS X错误,我仍然可以在其他平台上的调试配置中享受增强的错误检查。
答案 0 :(得分:3)
互斥锁只能是一种“类型”。你无法将它们结合起来。
这样做没有任何意义,无论如何 - 如果你试图重新锁定已经被同一个线程锁定的互斥锁,PTHREAD_MUTEX_ERRORCHECK
互斥锁总是返回错误,而PTHREAD_MUTEX_RECURSIVE
互斥锁总是成功那种情况。在其他错误检查情况下(解锁另一个线程已锁定的互斥锁,并解锁未锁定的互斥锁),PTHREAD_MUTEX_ERRORCHECK
和PTHREAD_MUTEX_RECURSIVE
具有相同的行为(始终返回错误)。
这意味着您的PTHREAD_MUTEX_RECURSIVE
互斥锁应该在“调试”版本中保持相同的类型,但将PTHREAD_MUTEX_ERRORCHECK
替换为PTHREAD_MUTEX_DEFAULT
和PTHREAD_MUTEX_NORMAL
互斥锁可能是有意义的。