【问题标题】:Why EDEADLK is not returned for consecutive pthread_mutex_lock even though ERRORCHECK is enabled?为什么即使启用了 ERRORCHECK,连续 pthread_mutex_lock 也不返回 EDEADLK?
【发布时间】: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 是否在平台上可用(我似乎记得pthread API 的某些方面是可选的)?
  • @G.M.我检查了settype,它没有返回错误。如果 PTHREAD_MUTEX_ERRORCHECK 不可用,则不会编译。
  • @G.M.好的,我发现错误是通过返回值而不是 errno 返回的,这就是我们没有看到任何带有 perror 的有效信息的原因。

标签: c++ concurrency pthreads mutex errno


【解决方案1】:

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

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

【讨论】:

  • 请注意,所有 pthread 函数都是如此——它们都在失败时返回错误号 (errno),在成功时返回 0。
  • @P.P 谢谢。这对我来说有点令人惊讶,但仍然是我的坏事,必须仔细阅读文档。
猜你喜欢
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 2022-01-11
  • 2012-09-17
  • 2015-05-22
  • 2021-05-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多