2

特定のミューテックスが原因でアプリケーションにデッドロックが発生しているようです。ただし、このコードは明らかに、ミューテックスがロックされた直後にロックを解除し、ロックとロック解除の間に他のミューテックスの依存関係はありません。ミューテックスが同じスレッドによって 2 回ロックされることは絶対にありません。

この問題は、アプリケーションの (多数の) 1 人のユーザーのみで発生しています。デッドロック中に生成されたコア ダンプを使用しています。待機中のスレッドはコア ダンプに表示されませんが、コードは、問題のミューテックスをロックしていないことを示しています。これは、ロックを保持しているスレッドからのバックトレースです。

(gdb) bt
#0  0x0000003aa4e0e054 in __lll_lock_wait () from /lib64/libpthread.so.0
#1  0x0000003aa4e09388 in _L_lock_854 () from /lib64/libpthread.so.0
#2  0x0000003aa4e09257 in pthread_mutex_lock () from /lib64/libpthread.so.0
#3  0x000000000043cf59 in my_processor (myvar=0x7fff36ba7430, mystring=0x7fff36ba76c0 
"This is a string")

問題のミューテックスのデータも出力しました。

(gdb) print my_mutex
$4 = {__data = {__lock = 2, __count = 0, __owner = 0, __nusers = 0, __kind = 2, __spins = 0, __list = {__prev = 0x0, __next = 0x0}},
  __size = "\002", '\000' <repeats 15 times>, "\002", '\000' <repeats 22 times>, __align = 2}

これは一貫していないようです。所有者は 0 であり、ロックを所有するスレッドがないことを示唆していますが、スレッドはミューテックスを待ってブロックしています。

次のスニペットは、mutex の宣言と初期化を示しています。

pthread_mutex_t my_mutex;
pthread_mutexattr_t mutex_attr;

/* set up mutex attributes */
pthread_mutexattr_init(&mutex_attr);
pthread_mutexattr_settype(&mutex_attr, PTHREAD_MUTEX_ERRORCHECK);

/* create mutex */
pthread_mutex_init(&my_mutex, &mutex_attr);

/* destroy mutex attributes */
pthread_mutexattr_destroy(&mutex_attr);

この問題の原因は何ですか?

4

0 に答える 0