【问题标题】:Pthread mutex lock assertion failsPthread 互斥锁断言失败
【发布时间】:2017-11-21 22:50:06
【问题描述】:

这几天我一直在努力解决这个问题,但似乎不是我的错。我不能发布任何代码,因为它足够大。我会尽力解释它。 首先它是一个multithreaded server application,它同时接收来自多个客户端的请求,并使用带有AF_UNIX 套接字的master-workers(线程池)样式对其进行详细说明。 当它运行时,它经常返回这个错误:

[name]: ../nptl/pthread_mutex_lock.c:81: __pthread_mutex_lock: 断言 `mutex->__data.__owner == 0' 失败。

我无法复制此错误或使用 valgrind 或 gdb 捕获它(我尝试了多次)。 我使用了几个用PTHREAD_MUTEX_INITIALIZER初始化的全局pthread_mutex_t,我从不销毁它们。我很确定可以围绕这样的代码安全地锁定和解锁它们:

  1. pthread_mutex_lock(&mutex);
  2. 如果某些事情失败并且我必须从一个线程返回:pthread_mutex_unlock(&mutex);return (void*) -1;
  3. else : 用共享变量做事
  4. pthread_mutex_unlock(&mutex);

我读到它可能是由pthread_mutex_lock 文件中的较低级别的竞争条件引起的,但我不确定。 顺便说一句,我会理解为什么这个断言可能会失败一般

【问题讨论】:

  • 是的,如果我在函数调用失败之前持有锁,我会解锁它并返回。我不会在入口处抓住锁,而是在我需要的地方。是的,我将-1 转换为void*pthread_join
  • 我必须释放我拥有的锁如果线程要被删除不?
  • 我不检查,我使用普通的 pthread 互斥锁。每个线程都只是尝试锁定它,并在获取它之后执行一些操作并释放它。
  • 您在 cmets 中提到的内容与您的问题并不完全一致,这就是为什么 MCVE 对正确回答您的问题至关重要。

标签: c multithreading pthreads assert


【解决方案1】:

这通常表明锁已经以某种方式损坏。一种可能性是您试图锁定一个从未初始化或已被销毁且未重新初始化的锁。另一种可能性是其他一些代码在互斥体上踩踏,可能是通过越界访问数组或在释放内存后访问某些内存。

【讨论】:

  • 或者他有一个线程试图解锁该线程尚未锁定的互斥锁,或者锁定它已经锁定的非递归互斥锁。
  • @JohnBollinger 我认为这产生了一个不同的错误,但现在我看它,我认为你是对的——这个错误可能是由一个线程试图获取它已经持有的锁产生的.
  • 我只是使用 pthread_mutex_normal 并且每个线程都执行 pthread_lock_acquire 来获得锁,即使它可能已经被我锁定了。有问题吗?
  • @BetaRunner 是的。除非锁定被特别配置为递归,否则锁定您已经持有的互斥锁的结果是未定义的。我还要补充一点,如果您的代码使用互斥锁执行某些操作并且不知道它是否拥有该互斥锁,那么您很有可能正在做非常非常错误的事情。
  • @BetaRunner 除非您的平台严重损坏,否则几乎可以肯定不会。
猜你喜欢
  • 2010-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-05
  • 2013-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多