ミューテックスのロックが解除されているようです。私のコードは次のようになります(実際のコードではありません)(pthreadを使用):
thread
{
int id=...;
//locked aditional mutex _m2
mutex_lock(&_m);
varx=valuex;//irelevant
print("th%d signaling listener",id);
cond_signal(&_c);
print("th%d signaled listener",id);
mutex_unlock(&_m);
//unlocked additional mutex _m2
}
listener
{
tc=0
mutex_lock(&_m);
while(tc<threadcount)
{
cond_wait(&_c,&_m);
print("working");
tc++
work;
}
mutex_unlock(&_m);
}
通常の (予測された) 出力:
th0 signaling listener;
working;
th0 signaled listener;
th1 signaling listener;
working;
th1 signaled listener;
私の出力:
0 signaling listener;
working;
0 signaled listener;
1 signaling listener;
1 signaled listener;
..したがって、スレッドは出力を印刷するためにスキップしました (リスナーは実行もロックも _m しません)
helgrind (full) でプロファイリングしましたが、エラーはありませんが、アプリはリスナーで停止します。彼によると、彼はすべてが終了するのを待っているからです。
注: リスナーは参加可能です。追加のミューテックス _m2 は役に立ちません。スレッドが切り離されています。スタックの問題を回避するために約 800 の切り離されたスレッドがあり、スレッド数を制限するためにセマフォを使用して最大 50 の同時スレッドがあります。コードは 3 ~ 4 スレッドで機能しました