0

そもそも、私の問題は違います。

私のシナリオでは、条件変数を待機する待機中のスレッドが 1 つあります。シグナルスレッドは条件変数をシグナルします。

私のコードは

//Wating thread

//Lock the mutex_
//mutex_ is of pthread_mutex_t  and is initialized.
result = pthread_mutex_lock(&mutex_);
assert(result == 0);

do {
    //Wait on condition variable cvar_
    //cva_ is of pthread_cond_t  and is initialized.
    result = pthread_cond_wait(&cvar_, &mutex_);  //POINT 1
}while(result == 0 && !state_);

//Unlock the mutex_.
result = pthread_mutex_unlock(&mutex_);

//signalling thread
result = pthread_mutex_lock(&mutex_); //POINT 2
assert(result == 0);
state_ = 1;
result = pthread_mutex_unlock(&mutex_);
assert(result == 0);

//signals the condition variable.
pthread_cond_signal(&cvar_);

私のオペレーティング システムは Mac OS X 10.8 ですが、最小ターゲットは 10.6
です。1 つを除いて、ほとんどすべてのケースで問題なく動作しています。

特定のケースでは、POINT 1 である の後pthread_cond_wait、mutex_ が待機状態に入ったときにロックが解除されていないことに気付きました。pthread_mutex_trylockこの場合、どちらが EBUSY を返すかで確認しました。これにより、シグナルスレッドが待機状態になり、最終的にデッドロックが発生します。

pthread_cond_wait渡されたミューテックスのロックを解除しない条件を知りたいです。この問題の原因は何ですか?

4

2 に答える 2

1

@KenThomases が指摘したように: あなたの問題は、信号が送信されていないことではなく、信号がないことです。待機中のスレッドが呼び出すpthread_cond_signal() 前に、シグナリング スレッドが呼び出していますpthread_cond_wait()。 探している不変条件が現在満たされていないことをテストした後にpthread_cond_wait()のみ呼び出す必要があります。

while (!state_) {
  result = pthread_cond_wait(&cvar_, &mutex_);
  if (result == EINVAL) ... // error handling
}

pthread_cond_signal()場合によっては、シグナル スレッドの呼び出しをクリティカル セクション内に配置することも役立ちます。これは問題を解決するために必要ではありませんが、シグナルを送信した時点で他の誰もミューテックスを保持していないことがわかっているため、プログラムの推論を容易にすることができます。

// signalling thread
...
result = pthread_mutex_lock(&mutex_);
...
state_ = 1;
//signals the condition variable.
pthread_cond_signal(&cvar_);
result = pthread_mutex_unlock(&mutex_);
...
于 2013-09-26T01:34:48.697 に答える
0

pthread_setcancelstateについて読んだ後、それpthread_cond_waitがスレッドのキャンセル ポイントであることがわかりました。スレッドでキャンセルが有効になっていて延期されている場合、キャンセル ポイントはキャンセルのテストを行います。保留中のキャンセルがある場合、スレッドは終了します。

したがって、私の場合、スレッドはmutex_をロックしたまま終了します。したがって、シグナルスレッドブロック。

しかし、もう1つ疑問があります。すべてのスレッドは、Thread クラスを使用して同じ関数から作成されています。なぜこのスレッドだけがこのようなキャンセルの動作をするのですか?

于 2013-09-28T04:31:06.967 に答える