C++ pthread_mutex_lock块,但_lock=0
我正在编写一个多线程程序,并且遇到了死锁 其中一个线程在其他线程睡眠时阻塞(cond_wait) 所以我输入ctrl+c进入gdb终端C++ pthread_mutex_lock块,但_lock=0,c++,c,multithreading,mutex,C++,C,Multithreading,Mutex,我正在编写一个多线程程序,并且遇到了死锁 其中一个线程在其他线程睡眠时阻塞(cond_wait) 所以我输入ctrl+c进入gdb终端 (gdb) info thread 5 Thread 0x1c6ff4a0 (LWP 723) __pthread_cond_wait (cond=0x420c50, mutex=0x420c34) at pthread_cond_wait.c:156 3 Thread 0x1bcf34a0 (LWP 721) __pthread_cond_wait
(gdb) info thread
5 Thread 0x1c6ff4a0 (LWP 723) __pthread_cond_wait (cond=0x420c50, mutex=0x420c34)
at pthread_cond_wait.c:156
3 Thread 0x1bcf34a0 (LWP 721) __pthread_cond_wait (cond=0x41a530, mutex=0x41a514)
at pthread_cond_wait.c:156
* 1 Thread 0x1b2c9720 (LWP 716) __lll_lock_wait (futex=0x1be08240, private=0)
at ../nptl/sysdeps/unix/sysv/linux/lowlevellock.c:46
(gdb) bt
#0 __lll_lock_wait (futex=0x1be08240, private=0)
at ../nptl/sysdeps/unix/sysv/linux/lowlevellock.c:46
#1 0x1afa1540 in __pthread_mutex_lock (mutex=0x1be08240) at pthread_mutex_lock.c:61
#2 0x1abb7984 in readerWait (FrameInfo=0x1be08240, sem=0x1aad4000)
at CamIPCSource.cpp:282
......
我可以看到这个线程在campicpsource.cpp:282被阻塞
但当我切换到第2帧并打印互斥时
(gdb) frame 2
#2 0x1abb7984 in readerWait (FrameInfo=0x1be08240, sem=0x1aad4000)
at CamIPCSource.cpp:282
(gdb) p FrameInfo->m_Reader
$1 = {__data = {__lock = 0, __count = 0, __owner = 0, __kind = 0, __nusers = 0, {
__spins = 0, __list = {__next = 0x0}}}, __size = '\000' <repeats 23 times>,
__align = 0}
顺便说一句,我试图在第283~290行用pthread_mutex_trylock替换pthread_mutex_lock
有时,它在一些“-”输出中工作得很好:(
这是ReaderSignal函数(ReaderWait/ReaderSignal是唯一两个访问此互斥体的函数)
使用GDB调试多线程程序通常比较困难。最好使用设计用于处理多线程问题的工具。我强烈建议查看Helgrind: <>页:“HelgRink是一个ValGRD工具,用于检测使用Posixp螺纹线程基元的C、C++和FORTRAN程序中的同步错误。” 它将提供潜在的比赛条件,死锁等信息。真是太棒了。它救了我不止一次
祝你好运!如果你添加源代码,它可能会帮助你解决问题。只有这两种情况使用了这个特定的互斥锁吗?还有
pthread\u mutex\u lock()
遗漏了错误检查!这个互斥体是如何初始化的?还有一个函数叫做readerSignal,与文章中的readerWait相反。两个函数都以pthread\u mutex\u锁开始,以pthread\u unlock结束。我用pthread\u mutex\u init和pthread\u PROCESS\u共享属性初始化了互斥体。实际上,我想知道的是有任何方法(除了gdb打印)来检查互斥的状态吗
277 int readerWait(frame_info_t* FrameInfo, sem_t* sem) {
278 int ret;
279
280 if (FrameInfo == NULL || sem == NULL) return -1;
281
282 pthread_mutex_lock(&FrameInfo->m_Reader);
283 /*while ((ret = pthread_mutex_trylock(&FrameInfo->m_Reader)) != 0) {
284 if (ret == EBUSY)
285 fprintf(stderr, "-");
286 else {
287 _err("pthread_mutex_trylock:(%s)\n", strerror(ret));
288 return -1;
289 }
290 }*/
291 292 FrameInfo->ReaderCount++;
293 if (FrameInfo->ReaderCount == 1) {
294 if (sem_wait(sem) != 0) {
295 _err("sem_wait:(%s)\n", strerror(errno));
296 FrameInfo->ReaderCount--;
297 if ((ret = pthread_mutex_unlock(&FrameInfo->m_Reader)) != 0);
298 _err("pthread_mutex_unlock:(%s)\n", strerror(ret));
299 return -1;
300 }
301 }
302 if ((ret = pthread_mutex_unlock(&FrameInfo->m_Reader)) != 0)
303 _err("pthread_mutex_unlock:(%s)\n", strerror(ret));
304
305 return 0;
306 }
339 int readerSignal(frame_info_t* FrameInfo, sem_t* sem) {
340 int ret;
341
342 if (FrameInfo == NULL || sem == NULL) return -1;
343
344 pthread_mutex_lock(&FrameInfo->m_Reader);
345 /*while ((ret = pthread_mutex_trylock(&FrameInfo->m_Reader)) != 0) {
346 if (ret == EBUSY)
347 fprintf(stderr, "-");
348 else {
349 _err("pthread_mutex_trylock:(%s)\n", strerror(ret));
350 return -1;
351 }
352 }*/
353 FrameInfo->ReaderCount--;
354 if (FrameInfo->ReaderCount == 0) {
355 if (sem_post(sem) != 0) {
356 _err("sem_post:(%s)\n", strerror(errno));
357 FrameInfo->ReaderCount++;
358 if ((ret = pthread_mutex_unlock(&FrameInfo->m_Reader)) != 0)
359 _err("pthread_mutex_unlock:(%s)\n", strerror(ret));
360 return -1;
361 }
362
363 }
364 if ((ret = pthread_mutex_unlock(&FrameInfo->m_Reader)) != 0)
365 _err("pthread_mutex_unlock:(%s)\n", strerror(ret));
366
367 return 0;
368 }