递归或错误检查互斥锁?

| 直到最近,我仍将错误检查互斥锁视为一种调试工具,在正确的代码中几乎没有价值,但后来我意识到它们具有可以替换递归互斥锁的特性,如下所示:
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
的函数调用。 我的问题主要是关于样式的:使用像这样的错误检查互斥体是否会损害代码的清晰度?还有其他原因您不想这样使用吗?
已邀请:
注意
pthread_mutex_lock
成功返回
0
和er2ѭ(如果呼叫者已经持有锁)。 您发布的代码并不完全可靠,因为ѭ2不是唯一可能返回的错误。如果未正确初始化互斥锁,则还有
EINVAL
。 略微切切的是,David Butenhof提出了一些有关使用递归互斥的有趣警告。
这是主观的,但是我认为这使代码不太清楚。
我认为,您可能意识到的任何性能提升都将首先被使用错误检查互斥体的成本所淹没。但是,即使是那些成本也可能很小,而且我看不出有任何理由不使用这种习语。我唯一的评论是使用像
locked
这样的变量名,而不是
ok_to_unlock

要回复问题请先登录注册