c - 递归或错误检查互斥体?

标签 c pthreads posix mutex

直到最近,我认为错误检查互斥体主要是作为一种调试工具,在正确的代码中几乎没有值(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 returns 0 on success and EDEADLK if the caller already holds the lock.

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

稍微有点离题,David Butenhof 有一些 interesting warnings关于递归互斥锁的使用。

关于c - 递归或错误检查互斥体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5716972/

相关文章:

我可以改编一个写入磁盘的函数来写入内存吗

c - 使用指向指针的指针初始化矩阵?

c++ - C++中如何使用栈

C 套接字 - 消息只发送一次

c - 持有互斥量时 POSIX 线程退出/崩溃/异常崩溃

c - 有 POSIX 函数来复制文件吗?

c - 使用 Bison 时的错误

C - execvp() 进程间通信

c - 在 C 中的 pthread_join 之后出现段错误(核心已转储)

c++ - pthread_create 模板函数——静态转换模板类