C++ c++;pthreads-尝试锁定互斥对象以进行读取时崩溃

C++ c++;pthreads-尝试锁定互斥对象以进行读取时崩溃,c++,crash,gdb,pthreads,mutex,C++,Crash,Gdb,Pthreads,Mutex,类LocalT具有实现读写互斥体的其他类的成员。在构造函数中初始化互斥体并使用pthread\u rwlock\u rdlock(&aMutex)用于读取锁。所以,看起来,使用互斥类就可以了。但当一些LocalT对象锁定其互斥体成员进行读取时,程序崩溃 CSerialize.cpp:2054行是MUTEX.lock_reading() 其他两个正在运行的线程: 1) 在socketaccept()处 2) 在popen()调用处的下一个可运行线程似乎是从管道执行或读取。但不知道什么是\uu er

LocalT
具有实现
读写互斥体的其他类的成员。在构造函数中初始化互斥体并使用
pthread\u rwlock\u rdlock(&aMutex)用于读取锁。所以,看起来,使用互斥类就可以了。但当一些
LocalT
对象锁定其互斥体成员进行读取时,程序崩溃

CSerialize.cpp:2054
行是
MUTEX.lock_reading()

其他两个正在运行的线程:

1) 在socket
accept()处

2) 在
popen()
调用处的下一个可运行线程似乎是从管道执行或
读取。但不知道什么是
\uu error()

Thread 1 (Thread 0x8614800 (LWP 100343)):
#0  0x4865b8f9 in __error () from /lib/libpthread.so.2
#1  0x4865a15a in pthread_testcancel () from /lib/libpthread.so.2
#2  0x486425bf in read () from /lib/libpthread.so.2
#3  0x08056340 in UT::execute_popen (command=@0x4865e6bc,
    ptr_output=0xbf2f7d30) at Utils.cpp:75
3) 所有其他线程都处于休眠状态

我不知道它为什么会坠毁?也许有人可以假设或建议

==编辑==

(gdb) bt
#0  0x4865a7db in pthread_testcancel () from /lib/libpthread.so.2
#1  0x48652412 in pthread_mutexattr_init () from /lib/libpthread.so.2
#2  0x489fd450 in ?? ()
Program terminated with signal 11, Segmentation fault.
[skiped]
#0  0x4865a7db in pthread_testcancel () from /lib/libpthread.so.2
[New Thread 0x8614800 (LWP 100343)]
[New Thread 0x8614600 (sleeping)]
[New Thread 0x8614400 (sleeping)]
[New Thread 0x8614200 (sleeping)]
[New Thread 0x8614000 (sleeping)]
[New Thread 0x80d4e00 (runnable)]
[New Thread 0x80d4c00 (sleeping)]
[New Thread 0x80d4a00 (LWP 100051)]
[New Thread 0x80d4000 (runnable)]
[New LWP 100802]

(gdb) info thread
* 10 LWP 100802  0x4865a7db in pthread_testcancel () from /lib/libpthread.so.2
  9 Thread 0x80d4000 (runnable)  0x486d7bd3 in accept () from /lib/libc.so.6 -- MAIN() THREAD
  8 Thread 0x80d4a00 (LWP 100051)  0x4865a79b in pthread_testcancel ()
   from /lib/libpthread.so.2 ( UNIDENTIFIED THREAD system()? ) 
  7 Thread 0x80d4c00 (sleeping)  0x48651cb6 in pthread_mutexattr_init ()
   from /lib/libpthread.so.2 (SIGNAL PROCESSOR THREAD)
  6 Thread 0x80d4e00 (runnable)  0x4864f11d in pthread_mutex_lock ()
   from /lib/libpthread.so.2 (MAINTENANCE THREAD)
  5 Thread 0x8614000 (sleeping)  0x48651cb6 in pthread_mutexattr_init ()
   from /lib/libpthread.so.2 (other mutex cond_wait - worker 1)
  4 Thread 0x8614200 (sleeping)  0x48651cb6 in pthread_mutexattr_init ()
   from /lib/libpthread.so.2 (other mutex cond_wait - worker 2 )
  3 Thread 0x8614400 (sleeping)  0x48651cb6 in pthread_mutexattr_init ()
   from /lib/libpthread.so.2 (other mutex cond_wait - worker 3 )
  2 Thread 0x8614600 (sleeping)  0x48651cb6 in pthread_mutexattr_init ()
   from /lib/libpthread.so.2 (other mutex cond_wait - worker 4)
  1 Thread 0x8614800 (LWP 100343)  0x4865b8f9 in __error ()
   from /lib/libpthread.so.2 ( popen() thread see below)
这里有一个系统(?)线程(我没有创建它,但程序总是有+1个线程)。它总是:

Thread 8 (Thread 0x80d4a00 (LWP 100051)):
#0  0x4865a79b in pthread_testcancel () from /lib/libpthread.so.2
#1  0x48652412 in pthread_mutexattr_init () from /lib/libpthread.so.2
#2  0x489fd450 in ?? ()
==EDIT2-bt根据请求==

(gdb) bt
#0  0x4865a7db in pthread_testcancel () from /lib/libpthread.so.2
#1  0x48652412 in pthread_mutexattr_init () from /lib/libpthread.so.2
#2  0x489fd450 in ?? ()
Program terminated with signal 11, Segmentation fault.
[skiped]
#0  0x4865a7db in pthread_testcancel () from /lib/libpthread.so.2
[New Thread 0x8614800 (LWP 100343)]
[New Thread 0x8614600 (sleeping)]
[New Thread 0x8614400 (sleeping)]
[New Thread 0x8614200 (sleeping)]
[New Thread 0x8614000 (sleeping)]
[New Thread 0x80d4e00 (runnable)]
[New Thread 0x80d4c00 (sleeping)]
[New Thread 0x80d4a00 (LWP 100051)]
[New Thread 0x80d4000 (runnable)]
[New LWP 100802]

(gdb) info thread
* 10 LWP 100802  0x4865a7db in pthread_testcancel () from /lib/libpthread.so.2
  9 Thread 0x80d4000 (runnable)  0x486d7bd3 in accept () from /lib/libc.so.6 -- MAIN() THREAD
  8 Thread 0x80d4a00 (LWP 100051)  0x4865a79b in pthread_testcancel ()
   from /lib/libpthread.so.2 ( UNIDENTIFIED THREAD system()? ) 
  7 Thread 0x80d4c00 (sleeping)  0x48651cb6 in pthread_mutexattr_init ()
   from /lib/libpthread.so.2 (SIGNAL PROCESSOR THREAD)
  6 Thread 0x80d4e00 (runnable)  0x4864f11d in pthread_mutex_lock ()
   from /lib/libpthread.so.2 (MAINTENANCE THREAD)
  5 Thread 0x8614000 (sleeping)  0x48651cb6 in pthread_mutexattr_init ()
   from /lib/libpthread.so.2 (other mutex cond_wait - worker 1)
  4 Thread 0x8614200 (sleeping)  0x48651cb6 in pthread_mutexattr_init ()
   from /lib/libpthread.so.2 (other mutex cond_wait - worker 2 )
  3 Thread 0x8614400 (sleeping)  0x48651cb6 in pthread_mutexattr_init ()
   from /lib/libpthread.so.2 (other mutex cond_wait - worker 3 )
  2 Thread 0x8614600 (sleeping)  0x48651cb6 in pthread_mutexattr_init ()
   from /lib/libpthread.so.2 (other mutex cond_wait - worker 4)
  1 Thread 0x8614800 (LWP 100343)  0x4865b8f9 in __error ()
   from /lib/libpthread.so.2 ( popen() thread see below)
奇怪的是。。。为什么
??()

==EDIT3-加载核心时==

(gdb) bt
#0  0x4865a7db in pthread_testcancel () from /lib/libpthread.so.2
#1  0x48652412 in pthread_mutexattr_init () from /lib/libpthread.so.2
#2  0x489fd450 in ?? ()
Program terminated with signal 11, Segmentation fault.
[skiped]
#0  0x4865a7db in pthread_testcancel () from /lib/libpthread.so.2
[New Thread 0x8614800 (LWP 100343)]
[New Thread 0x8614600 (sleeping)]
[New Thread 0x8614400 (sleeping)]
[New Thread 0x8614200 (sleeping)]
[New Thread 0x8614000 (sleeping)]
[New Thread 0x80d4e00 (runnable)]
[New Thread 0x80d4c00 (sleeping)]
[New Thread 0x80d4a00 (LWP 100051)]
[New Thread 0x80d4000 (runnable)]
[New LWP 100802]

(gdb) info thread
* 10 LWP 100802  0x4865a7db in pthread_testcancel () from /lib/libpthread.so.2
  9 Thread 0x80d4000 (runnable)  0x486d7bd3 in accept () from /lib/libc.so.6 -- MAIN() THREAD
  8 Thread 0x80d4a00 (LWP 100051)  0x4865a79b in pthread_testcancel ()
   from /lib/libpthread.so.2 ( UNIDENTIFIED THREAD system()? ) 
  7 Thread 0x80d4c00 (sleeping)  0x48651cb6 in pthread_mutexattr_init ()
   from /lib/libpthread.so.2 (SIGNAL PROCESSOR THREAD)
  6 Thread 0x80d4e00 (runnable)  0x4864f11d in pthread_mutex_lock ()
   from /lib/libpthread.so.2 (MAINTENANCE THREAD)
  5 Thread 0x8614000 (sleeping)  0x48651cb6 in pthread_mutexattr_init ()
   from /lib/libpthread.so.2 (other mutex cond_wait - worker 1)
  4 Thread 0x8614200 (sleeping)  0x48651cb6 in pthread_mutexattr_init ()
   from /lib/libpthread.so.2 (other mutex cond_wait - worker 2 )
  3 Thread 0x8614400 (sleeping)  0x48651cb6 in pthread_mutexattr_init ()
   from /lib/libpthread.so.2 (other mutex cond_wait - worker 3 )
  2 Thread 0x8614600 (sleeping)  0x48651cb6 in pthread_mutexattr_init ()
   from /lib/libpthread.so.2 (other mutex cond_wait - worker 4)
  1 Thread 0x8614800 (LWP 100343)  0x4865b8f9 in __error ()
   from /lib/libpthread.so.2 ( popen() thread see below)

我创建了:1个维护线程(序列化)、1个
popen()
线程、4个工作线程、1个主线程、1个信号线程=8个线程……

您称为系统线程的线程实际上是程序的
主线程

第二,由于到目前为止您共享了信息,看起来您正在获取互斥锁,但从未释放过它。这会导致不稳定状态(某些参数的值错误),从而导致崩溃。我相信您也会观察到间歇性挂起


当它崩溃时,您能否共享
回溯

谢谢你的回答。1) 否,主线程处于
accept()
状态。可能它的信号线程位于
sigwait()
state2)我将尝试搜索使用此互斥锁的代码,但是。。。似乎没有,我总是专注于。。。3) 添加+一些附加信息。请执行
info threads
,这将向您显示所有线程。如果我上面提到的关于不放弃锁的内容是真的,您将看到一堆线程在等待该互斥锁。“睡线”是工人。它们必须处于等待状态。正在等待来自主线程的信号。似乎您在这里遇到了更大的问题。似乎有很多线程试图在同一个互斥体上执行
pthread\u mutexattr\u init()
?难道不应该只有主线程才这样做吗?将此调用移动到
main()
函数