Linux で実行されているマルチスレッド プログラムがあります。それに対して gstack を実行すると、ロックを長時間 (たとえば 2 ~ 3 分) 待機しているスレッドが存在することがあります。
スレッド 2 (スレッド 0x5e502b90 (LWP 19853)):
0 0x40000410 in __kernel_vsyscall ()
/lib/i686/nosegneg/libpthread.so.0 からの __lll_lock_wait () の 1 0x400157b9
/lib/i686/nosegneg/libpthread.so.0 からの _L_lock_981 () の 2 0x40010e1d
/lib/i686/nosegneg/libpthread.so.0 からの pthread_mutex_lock () の 3 0x40010d3b
...
残りのスレッドをチェックしたところ、いずれもこのロックを取得していませんでしたが、しばらくすると、このスレッド (LWP 19853) がこのロックを正常に取得できました。
このロックを既に取得しているスレッドが 1 つ存在するはずですが、見つかりませんでした。足りないものはありますか?
編集: pthread_mutex_t の定義:
型定義ユニオン
{
struct __pthread_mutex_s {
int __ロック;
unsigned int __count;
int __所有者;
/* バイナリ互換性を維持するために、KIND は構造内のこの位置にとどまる必要があります。*/
int __種類;
unsigned int __nusers;
拡張ユニオン { int __spins; __pthread_slist_t __list; };
} __データ;
char _ size[ _SIZEOF_PTHREAD_MUTEX_T];
long int __align;
} pthread_mutex_t;
メンバー「__owner」があり、現在ミューテックスを保持しているスレッドのIDです。