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

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

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()

“cond”未初始化。 您在消费者和生产者之间存在竞争条件。 如果任何“while”条件变为真,则它们将导致无限循环,因为没有指令改变“while”范围(两者)中“count”的值。