0

我知道下面的代码做了什么,我知道为什么它是一个损坏的同步代码,因为它只有一个条件变量,而我们需要两个,但我不知道如何提供一系列交错线程来显示它不起作用. 你能用一个例子说明为什么这段代码不能工作吗?

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 回答
1

假设put()设置count为 1 并get()设置为 0,只要您只有一个生产者和一个消费者count,这段代码实际上就可以了。

如果您有多个生产者,则生产者中的pthread_cond_signal()in 可能会唤醒其他生产者之一而不是消费者,然后没有消费者会继续。如果您有多个消费者,也会存在同样的问题。

您可以通过为空和满引入单独的条件变量或使用pthread_cond_broadcast()代替来解决此问题pthread_cond_signal()

于 2013-10-29T05:59:16.070 回答