首页 > 解决方案 > 为什么即使启用了 ERRORCHECK,连续 pthread_mutex_lock 也不返回 EDEADLK?

问题描述

我正在试验 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 的细节。

标签: c++concurrencypthreadsmutexerrno

解决方案


我发现没有设置errno。以下解决问题。

const int ret = pthread_mutex_lock(&mtx);
if (ret != 0) {
   errno = ret;
   perror("mutex lock: ");
   return;
}
mutex lock: : Resource deadlock avoided

推荐阅读