Pthreads PTHREAD_MUTEX_*和PTHREAD_MUTEX_ERRORCHECK是互斥的吗?

Pthreads PTHREAD_MUTEX_*和PTHREAD_MUTEX_ERRORCHECK是互斥的吗?,pthreads,mutex,Pthreads,Mutex,开放组有一个规范,用于pthread\u mutex\u lock、pthread\u mutex\u trylock、pthread\u mutex\u unlock和找到的朋友 该页面列出了四个互斥体属性值:PTHREAD\u mutex\u NORMAL、PTHREAD\u mutex\u ERRORCHECK、PTHREAD\u mutex\u RECURSIVE和PTHREAD\u mutex\u DEFAULT 所有的价值观都是相互排斥的吗?在调试配置中,是否允许我们一起或这些值?例

开放组有一个规范,用于
pthread\u mutex\u lock
pthread\u mutex\u trylock
pthread\u mutex\u unlock
和找到的朋友

该页面列出了四个互斥体属性值:
PTHREAD\u mutex\u NORMAL
PTHREAD\u mutex\u ERRORCHECK
PTHREAD\u mutex\u RECURSIVE
PTHREAD\u mutex\u DEFAULT

所有的价值观都是相互排斥的吗?在调试配置中,是否允许我们一起
这些值?例如,我希望在Debug中进行完整的错误检查,那么
PTHREAD\u MUTEX\u ERRORCHECK | PTHREAD\u MUTEX\u RECURSIVE
是有效的配置吗


我询问的原因是我捕获到一个错误
pthread\u mutexattr\u settype
。我不确定这是否是一个有效的配置和OSX实现错误;或者如果它是无效的配置和预期的标准行为。如果是OS X错误,我仍然可以享受在其他平台上调试配置中增强的错误检查功能。

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

无论如何,这样做是没有意义的-
PTHREAD\u MUTEX\u ERRORCHECK
MUTEX在尝试重新锁定已被同一线程锁定的互斥时总是返回错误,而在这种情况下,
PTHREAD\u MUTEX\u RECURSIVE
MUTEX总是成功。在其他错误检查情况下(解锁另一个线程已锁定的互斥锁,以及解锁已解锁的互斥锁),
PTHREAD\u mutex\u ERRORCHECK
PTHREAD\u mutex\u RECURSIVE
具有相同的行为(总是返回错误)


这意味着您的
PTHREAD\u MUTEX\u RECURSIVE
互斥体在“调试”构建中应该保持相同的类型,但是用
PTHREAD\u MUTEX\u ERRORCHECK
替换
PTHREAD\u MUTEX\u DEFAULT
PTHREAD\u MUTEX\u NORMAL
互斥体可能是有意义的。谢谢Caf。“在其他错误检查案例中…”-这就是问题所在(对我而言)。我不知道当“错误检查”生效时会发生多少额外的检查。如果pthreads以效率的名义跳过一些检查,那么我希望执行这些检查。我从来没有理解过“让我们赶快做错事”的心态。如果它坏了,那么不管你做得有多快。@noloader:POSIX不允许在
PTHREAD\u MUTEX\u RECURSIVE
案例中省略错误检查-在
PTHREAD\u MUTEX\u RECURSIVE
PTHREAD\u MUTEX\u ERRORCHECK
之间唯一的区别是在relock-a-MUTEX-read-hold-hold案例中发生的情况。只有
PTHREAD\u MUTEX\u DEFAULT
PTHREAD\u MUTEX\u NORMAL
具有未定义的行为情况。未定义行为案例背后的理念是,正确的应用程序不必支付检查错误应用程序中错误的间接成本。