可以在调用pthread_cond_wait()之前检查互斥锁是否被锁定?

时间:2012-03-01 07:41:17

标签: c linux pthreads

我想在我的代码中为pthread_cond_wait的抽象添加一些调试代码,以检查调用代码是否真正保留了互斥锁。这是为了检查其他呼叫者的正确性。

有没有办法检查互斥锁是否被锁定,或者在pthreads实现中启用调试模式(在Linux上)告诉我它是不是?

3 个答案:

答案 0 :(得分:3)

如果使用以下命令创建互斥锁作为错误检查互斥锁,则使用:

pthread_mutexattr_t attr;
pthread_mutex_t errchkmutex;

pthread_mutexattr_init(&attr);
pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_ERRORCHECK);
pthread_mutex_init(&errchkmutex, &attr);

...如果互斥锁未被调用线程锁定,则pthread_cond_wait()将返回EPERM

(当然你会在该互斥初始化代码中添加错误检查)。

我认为错误检查互斥锁正是您正在寻找的那种“调试模式”。

答案 1 :(得分:0)

除非互斥锁被调用线程锁定,否则

pthread_cond_wait将失败。你在检查pthread函数的返回值吗?如果没有,这是一个灾难的处方,更多的是使用线程而不是其他系统调用。

答案 2 :(得分:0)

从zvrba和“R”以及其他一些研究拼凑而来的答案是创建具有错误检查属性的互斥锁,并检查pthread_cond_wait()的返回值。

pthread_mutexattr_settype(&mattr, PTHREAD_MUTEX_ERRORCHECK);

其他相关信息:

  • 我的glibc在任何包含之前需要#define _GNU_SOURCE才能启用pthread_mutexattr_settype()

  • 我发现我确实安装了POSIX联机帮助页以及“LinuxThreads”联机帮助页。我不确定是什么(ubuntu)打包了各种来源,但是编辑/etc/manpath.config以放置“3posix”首先意味着我现在得到正确的。