PTHREAD_MUTEX_ *和PTHREAD_MUTEX_ERRORCHECK是互斥的吗?

时间:2013-11-24 22:04:32

标签: pthreads mutex

Open Group有pthread_mutex_lockpthread_mutex_trylockpthread_mutex_unlock和位于here的朋友的规范。

该页面列出了四个互斥锁属性值:PTHREAD_MUTEX_NORMALPTHREAD_MUTEX_ERRORCHECKPTHREAD_MUTEX_RECURSIVEPTHREAD_MUTEX_DEFAULT

所有价值是否互相排斥?在Debug配置中,我们是否允许OR这些值一起使用?例如,我想在Debug中进行完整的错误检查,PTHREAD_MUTEX_ERRORCHECK | PTHREAD_MUTEX_RECURSIVE是否有效配置?

我问的原因是我发现错误pthread_mutexattr_settype。我不确定它是否是有效的配置和OS X实现错误;或者如果它的配置无效且预期的标准行为。如果它是OS X错误,我仍然可以在其他平台上的调试配置中享受增强的错误检查。

1 个答案:

答案 0 :(得分:3)

互斥锁只能是一种“类型”。你无法将它们结合起来。

这样做没有任何意义,无论如何 - 如果你试图重新锁定已经被同一个线程锁定的互斥锁,PTHREAD_MUTEX_ERRORCHECK互斥锁总是返回错误,而PTHREAD_MUTEX_RECURSIVE互斥锁总是成功那种情况。在其他错误检查情况下(解锁另一个线程已锁定的互斥锁,并解锁未锁定的互斥锁),PTHREAD_MUTEX_ERRORCHECKPTHREAD_MUTEX_RECURSIVE具有相同的行为(始终返回错误)。

这意味着您的PTHREAD_MUTEX_RECURSIVE互斥锁应该在“调试”版本中保持相同的类型,但将PTHREAD_MUTEX_ERRORCHECK替换为PTHREAD_MUTEX_DEFAULTPTHREAD_MUTEX_NORMAL互斥锁可能是有意义的。