直到最近,我认为错误检查互斥锁主要是作为一个调试工具,在正确的代码中几乎没有价值,但后来我意识到它们具有可以替换递归互斥锁的属性,如:
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}}函数。
我的问题主要是关于样式:使用这样的错误检查互斥体是否会降低代码的清晰度?还有其他原因你不想这样使用它们吗?
答案 0 :(得分:2)
这是主观的,但我觉得这会使代码不那么清晰。
答案 1 :(得分:2)
请注意
pthread_mutex_lock
成功时返回0
如果来电者已经持有锁,则为EDEADLK
。
您发布的代码并不完全可靠,因为EDEADLK
不是唯一可能返回的错误。如果互斥锁未正确初始化,还有EINVAL
。
在一个略微切线的说明中,David Butenhof关于递归互斥体的使用有一些interesting warnings。
答案 2 :(得分:1)
我认为,无论您可能意识到什么性能提升,都会被首先使用错误检查互斥锁的成本所淹没。然而,即使这些成本可能很小,我也没有理由不使用这个成语。我唯一的评论是使用locked
之类的变量名称,而不是ok_to_unlock
。