0

私は次のコードが何をするかを知っており、条件変数が 1 つしかないのに 2 つ必要であるため、同期の壊れたコードである理由を知っていますが、それが機能しないことを示すために一連のインターリーブ スレッドを提供する方法がわかりません。 . このコードが機能しない理由を例で説明できますか?

1   cond_t cond = PTHREAD_COND_INITIALIZER; 
2  mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;;
3
4  void *producer(void *arg) {
5    int i;
6    for (i = 0; i < loops; i++) {
7      Pthread_mutex_lock(&mutex);
8      while (count == 1)
9        Pthread_cond_wait(&cond, &mutex);
10     put(i);
11     Pthread_cond_signal(&cond);
12     Pthread_mutex_unlock(&mutex);
13   }
14 }
15
16 void *consumer(void *arg) {
17   int i;
18   for (i = 0; i < loops; i++) {
19     Pthread_mutex_lock(&mutex);
20     while (count == 0)
21       Pthread_cond_wait(&cond, &mutex);
22     int tmp = get();
23     Pthread_cond_signal(&cond);
24     Pthread_mutex_unlock(&mutex);
25     printf("%d\n", tmp);
26   }
27 }
4

2 に答える 2

1

「cond」は初期化されていません。コンシューマーとプロデューサーの間に競合状態があります。「while」条件のいずれかが真になると、「while」スコープ (両方) の「count」の値を変更する命令がないため、無限ループが発生します。

于 2013-10-28T19:49:00.393 に答える