我知道下面的代码是做什么的,我知道为什么它是一个错误的同步代码,因为它只有一个条件变量,而我们需要两个,但我不知道如何提供一系列交错线程来显示它没有工作。你能举例说明为什么这段代码不起作用吗?
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 }
假设 put()
将 count
设置为 1,而 get()
将 count
设置为 0,这只要您只有一个生产者和一个消费者,代码实际上就可以了。
如果您有多个生产者,那么生产者中的 pthread_cond_signal()
可能会唤醒其他生产者之一而不是消费者,然后没有消费者会继续。如果您有多个消费者,也会存在同样的问题。
您可以通过为 empty 和 full 引入单独的条件变量,或者使用 pthread_cond_broadcast()
而不是 pthread_cond_signal()
来解决这个问题。
我是一名优秀的程序员,十分优秀!