gpt4 book ai didi

c - 如何提供一系列交错线程来表明代码中断并且没有提供完美的同步?

转载 作者:太空宇宙 更新时间:2023-11-04 08:51:13 25 4
gpt4 key购买 nike

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

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() 来解决这个问题。

关于c - 如何提供一系列交错线程来表明代码中断并且没有提供完美的同步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19642938/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com