直到最近,我认为是错误检查互斥锁大多为与正确的代码没有什么价值一个调试工具,但后来我意识到它们具有可替代递归互斥体的属性,如:递归或错误检查互斥?
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
。
我的问题主要是关于然后风格:不使用错误检查互斥就像从代码的清晰度此减损?是否有其他原因,你不想这样使用它们?
这听起来很主观。 :) – unwind 2011-04-19 13:23:45
我想;但最后一句话中的问题有点非主观的转折点(非风格原因,这种用法会很糟糕)。 – 2011-04-19 13:26:25
除了风格 - 我会研究PTHREAD_MUTEX_ERRORCHECK的性能。如果保存一些pthread_mutex_xxx调用,如果它检测到错误检查互斥是例如,它可能不值得。比普通或递归互斥锁慢10倍 – nos 2011-04-19 13:27:28