2

ここから: https://computing.llnl.gov/tutorials/pthreads/#ConVarSignal

pthread_cond_wait ルーチンは、待機中にミューテックスを自動的かつアトミックにロック解除することに注意してください。

次のサブコードは同じリンクからのものです(私がフォーマットしています):

pthread_mutex_lock(&count_mutex);

  while (count<COUNT_LIMIT) 
  {
      pthread_cond_wait(&count_threshold_cv, &count_mutex);
      printf("watch_count(): thread %ld Condition signal received.\n", my_id);
      count += 125;
      printf("watch_count(): thread %ld count now = %d.\n", my_id, count);
  }

pthread_mutex_unlock(&count_mutex);  

質問:待機中にミューテックスが自動的にロック解除される
と書かれている場合、上記のコードの最後で関数を明示的に指定する必要があるのはなぜですか?pthread_cond_waitpthread_mutex_unlock

私が見逃しているポイントは何ですか?

4

1 に答える 1

4

ブロックを解除するpthread_cond_waitと、再びロックが保持されます。たとえば、ループを 2 回回ると、ミューテックスで次の一連のロック/ロック解除が得られるとします。

lock

# Around loop twice:
    wait (unlock)
    awaken (holding lock)
    wait (unlock)
    awaken (holding lock)

# loop done, still holding lock

unlock

そこに最後のロック解除がない場合、次に誰かがロックを取得しようとしたときにデッドロックが発生します。

于 2012-06-16T10:46:54.720 に答える