【发布时间】: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,我从不销毁它们。我很确定可以围绕这样的代码安全地锁定和解锁它们:
pthread_mutex_lock(&mutex);- 如果某些事情失败并且我必须从一个线程返回:
pthread_mutex_unlock(&mutex);和return (void*) -1; - else : 用共享变量做事
pthread_mutex_unlock(&mutex);
我读到它可能是由pthread_mutex_lock 文件中的较低级别的竞争条件引起的,但我不确定。
顺便说一句,我会理解为什么这个断言可能会失败一般
【问题讨论】:
-
是的,如果我在函数调用失败之前持有锁,我会解锁它并返回。我不会在入口处抓住锁,而是在我需要的地方。是的,我将
-1转换为void*为pthread_join -
我必须释放我拥有的锁如果线程要被删除不?
-
我不检查,我使用普通的 pthread 互斥锁。每个线程都只是尝试锁定它,并在获取它之后执行一些操作并释放它。
-
您在 cmets 中提到的内容与您的问题并不完全一致,这就是为什么 MCVE 对正确回答您的问题至关重要。
标签: c multithreading pthreads assert