0

ミューテックスのロックが解除されているようです。私のコードは次のようになります(実際のコードではありません)(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 スレッドで機能しました

4

1 に答える 1

0

pthread_cond_signal()どのミューテックスもロック解除しません。想定されていません (mutex は渡されません)。少なくとも 1 つのスレッドがシグナル状態変数で待機している場合、そのスレッドは、渡されたミューテックスを再取得できるときにスケジュールされpthread_cond_wait()ます。

あなたの場合、リスナー_sは他のスレッド シグナル ( _c) とは異なる条件 ( ) で待機しているように見えます。

その問題を修正すると、条件変数を待機するスレッドとそれを通知するスレッドとの間に共有状態がないように見えるという問題も発生します。カウンターは、実際にはミューテックスtcによって保護された共有変数である必要があるようです。_m次に、スレッドは次のようになります。

pthread_mutex_lock(&_m);
tc++;
if (tc >= threadcount)
    pthread_cond_signal(&_c);
pthread_mutex_unlock(&_m);

リスナーは次のようにします。

pthread_mutex_lock(&_m);
while (tc < threadcount)
    pthread_mutex_wait(&_c, &_m);
pthread_mutex_unlock(&_m);

リスナーは、すべてのスレッドがシグナリング コードにヒットした場合にのみ続行されます。これは、あなたが求めているようです。

pthread_barrier_wait()または、実装しているように見える を使用することもできます。

于 2012-10-05T11:26:29.293 に答える