直到最近,我认为错误检查互斥体主要是作为一种调试工具,在正确的代码中几乎没有值(value),但后来我意识到它们具有可以替换递归互斥体的属性,如下所示:
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
函数。
我的问题主要是关于风格:使用这样的错误检查互斥体是否会降低代码的清晰度?您还有其他原因不想这样使用它们吗?
最佳答案
Note that
pthread_mutex_lock
returns0
on success andEDEADLK
if the caller already holds the lock.
您发布的代码并不完全可靠,因为 EDEADLK
并不是唯一可能返回的错误。如果互斥体尚未正确初始化,还会出现 EINVAL
。
稍微有点离题,David Butenhof 有一些 interesting warnings关于递归互斥锁的使用。
关于c - 递归或错误检查互斥体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5716972/