递归或错误检查互斥?

时间:2011-04-19 13:18:21

标签: c pthreads posix mutex

直到最近,我认为错误检查互斥锁主要是作为一个调试工具,在正确的代码中几乎没有价值,但后来我意识到它们具有可以替换递归互斥锁的属性,如:

void foo()
{
    int ok_to_unlock = !pthread_mutex_lock(m);
    /* do something */
    if (ok_to_unlock) pthread_mutex_unlock(m);
}

请注意,pthread_mutex_lock成功时返回0,如果调用者已持有锁,则EDEADLK返回pthread_mutex_unlock。这种用法的优点是您不必担心超过任意递归锁定限制; “锁定计数”隐含在调用帧中。原则上,这个成语也可能稍微好一点,因为当调用线程已经持有锁时,永远不会调用{{1}}函数。

我的问题主要是关于样式:使用这样的错误检查互斥体是否会降低代码的清晰度?还有其他原因你不想这样使用它们吗?

3 个答案:

答案 0 :(得分:2)

这是主观的,但我觉得这会使代码不那么清晰。

答案 1 :(得分:2)

  

请注意pthread_mutex_lock成功时返回0   如果来电者已经持有锁,则为EDEADLK

您发布的代码并不完全可靠,因为EDEADLK 不是唯一可能返回的错误。如果互斥锁未正确初始化,还有EINVAL

在一个略微切线的说明中,David Butenhof关于递归互斥体的使用有一些interesting warnings

答案 2 :(得分:1)

我认为,无论您可能意识到什么性能提升,都会被首先使用错误检查互斥锁的成本所淹没。然而,即使这些成本可能很小,我也没有理由不使用这个成语。我唯一的评论是使用locked之类的变量名称,而不是ok_to_unlock