【发布时间】:2020-08-15 09:06:50
【问题描述】:
我正在试验 pthread API,想了解一些东西。
据我了解,以下代码应生成 EDEADLK 错误代码,但我收到未定义错误:
mutex lock: : Undefined error: 0
void case3_error_checking_mutex()
{
pthread_mutexattr_t attr;
pthread_mutexattr_init(&attr);
pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_ERRORCHECK);
pthread_mutex_t mtx;
pthread_mutex_init(&mtx, &attr);
pthread_mutex_lock(&mtx);
if (pthread_mutex_lock(&mtx) != 0) {
perror("mutex lock: ");
return;
}
pthread_mutex_unlock(&mtx);
}
有什么想法吗?
谢谢!
PS:我知道什么是递归互斥锁,我知道什么是死锁,我知道这是丑陋的代码等等。请不要评论这些东西。这是纯粹的实验代码,让我更好地了解 pthread API 的细节。
【问题讨论】:
-
您是否检查过其他函数返回的值——pthread_mutexattr_settype 等?互斥体类型
PTHREAD_MUTEX_ERRORCHECK是否在平台上可用(我似乎记得pthreadAPI 的某些方面是可选的)? -
@G.M.我检查了settype,它没有返回错误。如果 PTHREAD_MUTEX_ERRORCHECK 不可用,则不会编译。
-
@G.M.好的,我发现错误是通过返回值而不是 errno 返回的,这就是我们没有看到任何带有 perror 的有效信息的原因。
标签: c++ concurrency pthreads mutex errno