【问题标题】:Are PTHREAD_MUTEX_* and PTHREAD_MUTEX_ERRORCHECK mutually exclusive?PTHREAD_MUTEX_* 和 PTHREAD_MUTEX_ERRORCHECK 是否互斥?
【发布时间】:2013-11-24 22:04:31
【问题描述】:

The Open Group 有一个针对pthread_mutex_lockpthread_mutex_trylockpthread_mutex_unlock 和位于here 的朋友的规范。

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

所有的值都是互斥的吗?在调试配置中,我们是否允许将这些值 OR 一起使用?例如,我想在 Debug 中进行完整的错误检查,那么PTHREAD_MUTEX_ERRORCHECK | PTHREAD_MUTEX_RECURSIVE 是一个有效的配置吗?

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

【问题讨论】:

    标签: pthreads mutex


    【解决方案1】:

    互斥锁只能是一种“类型”。您不能将它们组合在一起。

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

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

    【讨论】:

    • 谢谢咖啡馆。 “在其他错误检查情况下......” - 这就是问题(对我来说)。我不知道“错误检查”生效时会发生多少额外检查。如果 pthreads 以效率的名义跳过一些检查,那么我希望执行这些检查。我从来不理解“让我们快点做错事”的心态。如果它坏了,那么你做的速度有多快并不重要。
    • @noloader:POSIX 不允许在 PTHREAD_MUTEX_RECURSIVE 情况下省略错误检查 - PTHREAD_MUTEX_RECURSIVEPTHREAD_MUTEX_ERRORCHECK 之间的唯一区别是 relock-a-互斥锁已经持有的案例。只有PTHREAD_MUTEX_DEFAULTPTHREAD_MUTEX_NORMAL 有未定义行为的情况。未定义行为案例背后的理念是,正确的应用程序不应该支付检查错误应用程序中的错误的开销。
    猜你喜欢
    • 2014-03-10
    • 2011-01-06
    • 1970-01-01
    • 2018-05-23
    • 1970-01-01
    • 2011-09-16
    • 1970-01-01
    • 2020-03-18
    • 1970-01-01
    相关资源
    最近更新 更多