2

以前、pthread_join を使用せずに 2 つのスレッドを同期することについて問い合わせましたが、pthread_cond_wait と pthread_cond_signal を使用して解決できました。この機能を 1 つの場所にまとめる小さな構造体を作成しました。

struct ConditionWait
{
    int                 i_ConditionPredicate;
    pthread_mutex_t     lock_Var;
    pthread_cond_t      cond_Var;
    int                 i_ValidResult;

    ConditionWait()
    {
        pthread_mutex_init(&lock_Var, NULL);
        pthread_cond_init(&cond_Var, NULL);
        i_ValidResult = 1;
        i_ConditionPredicate = 0;
    }

    void Signal()
    {
        pthread_mutex_lock(&lock_Var);
        i_ConditionPredicate = i_ValidResult;
        pthread_cond_signal(&cond_Var);
        pthread_mutex_unlock(&lock_Var);
    }

    void Wait()
    {
        pthread_mutex_lock(&lock_Var);

        while(i_ConditionPredicate != i_ValidResult)
        {
            pthread_cond_wait(&cond_Var, &lock_Var);
        }
        pthread_mutex_unlock(&lock_Var);
    }
};

2 つの異なるスレッドから Wait() と Signal() を呼び出すと仮定すると、これはスレッド セーフになります。同じオブジェクトの 2 つの関数で同じロックを取得すると、デッドロックや競合状態が発生しますか?

編集:私は今これを自分のプログラムで使用していますが、正常に動作します。運が良かっただけなのかよくわからない

4

1 に答える 1

5

これは一度だけ機能します。待機中のスレッドを起動した後、次の待機の試行はすべて成功し、条件述語を「リセット」しないため、ブロックされることはありません。これが必要な場合 (または状況によっては問題にならない場合) は、はい、これは安全であり、条件変数が通常使用される方法です。

PS:このことのデストラクタでもpthread_mutex_destroy()andを使用する必要があります。pthread_cond_destroy()

于 2009-04-08T14:12:02.297 に答える