1

クラスLocalTには、 を実現した他のクラスのメンバーがいread-write-mutexます。pthread_rwlock_rdlock(&aMutex);コンストラクターで初期化され、ロックの読み取りに使用されるミューテックス。したがって、ミューテックスクラスで問題ないようです。しかし、いくつかのLocalTオブジェクトが読み取りのためにミューテックスメンバーをロックすると、プログラムがクラッシュしました。

CSerialize.cpp:2054ラインはMUTEX.lock_reading();

Thread 6 (Thread 0x80d4e00 (runnable)):
#0  0x4864f11d in pthread_mutex_lock () from /lib/libpthread.so.2
#1  0x4864b558 in pthread_rwlock_init () from /lib/libpthread.so.2
#2  0x4864b659 in pthread_rwlock_rdlock () from /lib/libpthread.so.2
#3  0x0807ae14 in LocalT::serialize (this=0x80d4e00, outbin=@0x7574736b)
    at CSerialize.cpp:2054

他の 2 つの実行中のスレッド:

1) ソケットでaccept();

2) 呼び出し時の次の実行可能なスレッドはpopen()、その実行またはreadパイプからのようです。しかし、何か分からない__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) 他のすべてのスレッドがスリープ状態。

なぜクラッシュしたのかわかりませんか?多分誰かが何かを推測したり提案したりできますか?

==編集==

ここに1つのシステム(?)スレッドがあります(私はそれを作成しませんが、プログラムは常に+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 - リクエストに応じて ==

(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 ?? ()

不思議…どうして?? ()

==EDIT3 - コアのロード時==

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 スレッド....

4

1 に答える 1

1

システム スレッドとして参照しているスレッドは、実際にはプログラムのmain thread.

第二に、これまでに共有された情報によると、ミューテックスを取得しているようですが、決して解放していないようです。これはクラッシュにつながる不安定な状態 (一部のパラメーターが間違った値を持つ) につながります。断続的なハングも見られると思います。

backtrace クラッシュしたときを共有できますか?

于 2012-06-14T23:10:01.683 に答える