您好,我正在创建一个简单的计数器,使用生产者-消费者方法来通知一个线程何时完成,以便另一个线程可以运行,这允许它们交替.当我运行代码时,计数按预期从0到10打印了10次.但在计数的每一次打印之间,我得到了十几个锁和解锁的 fingerprint ,以及信号,这让我认为我的代码设置错误.
消费者和生产者端的每个迭代不应该只有一个锁定、解锁和信号吗?输出示例如下:
myCount: 6 -> 7
Producer: signaling myCond1
Producer: waiting on myCond2
CONSUMER: myMutex locked
CONSUMER: signaling myCond2
CONSUMER: myMutex unlocked
Producer: myMutex unlocked
Producer: myMutex locked
CONSUMER: myMutex locked
CONSUMER: signaling myCond2
CONSUMER: myMutex unlocked
myCount: 7 -> 8
Producer: signaling myCond1
Producer: waiting on myCond2
CONSUMER: myMutex locked
CONSUMER: signaling myCond2
CONSUMER: myMutex unlocked
Producer: myMutex unlocked
Producer: myMutex locked
CONSUMER: myMutex locked
CONSUMER: signaling myCond2
CONSUMER: myMutex unlocked
myCount: 8 -> 9
Producer: signaling myCond1
Producer: waiting on myCond2
CONSUMER: myMutex locked
CONSUMER: signaling myCond2
CONSUMER: myMutex unlocked
Producer: myMutex unlocked
Producer: myMutex locked
CONSUMER: myMutex locked
CONSUMER: signaling myCond2
CONSUMER: myMutex unlocked
myCount: 9 -> 10
Producer: signaling myCond1
Producer: waiting on myCond2
CONSUMER: myMutex locked
CONSUMER: signaling myCond2
Producer: myMutex unlocked
Producer: myMutex locked
PROGRAM END
以下是代码:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
// Global variables
pthread_mutex_t myMutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t myCond1 = PTHREAD_COND_INITIALIZER;
pthread_cond_t myCond2 = PTHREAD_COND_INITIALIZER;
int myCount = 0;
// Function prototypes
void* producerThread(void* arg);
void* consumerThread(void* arg);
int main() {
// Create consumer thread
pthread_t consumer;
printf("PROGRAM START\n");
if (pthread_create(&consumer, NULL, consumerThread, NULL) != 0) {
perror("Error creating consumer thread");
exit(EXIT_FAILURE);
}
// Run the producer thread
producerThread(NULL);
// Wait for the consumer thread to finish
pthread_join(consumer, NULL);
printf("PROGRAM END\n");
return 0;
}
void* producerThread(void* arg) {
while (1) {
printf("Producer: myMutex locked\n");
pthread_mutex_lock(&myMutex);
if (myCount >= 10) {
pthread_mutex_unlock(&myMutex);
break; // Terminate the program when myCount reaches 10
}
myCount++;
printf("myCount: %d -> %d\n", myCount - 1, myCount);
// Signal the consumer that a new value is available
printf("Producer: signaling myCond1\n");
pthread_cond_signal(&myCond1);
printf("Producer: waiting on myCond2\n");
pthread_cond_wait(&myCond2, &myMutex);
pthread_mutex_unlock(&myMutex);
printf("Producer: myMutex unlocked\n");
}
return NULL;
}
void* consumerThread(void* arg) {
printf("CONSUMER THREAD CREATED\n");
while (1) {
pthread_mutex_lock(&myMutex);
printf("CONSUMER: myMutex locked\n");
// Wait for the producer to signal that a new value is available
while (myCount == 0) {
printf("CONSUMER: waiting on myCond1\n");
pthread_cond_wait(&myCond1, &myMutex);
}
// Signal the producer that the value has been consumed
printf("CONSUMER: signaling myCond2\n");
pthread_cond_signal(&myCond2);
if (myCount >= 10) {
pthread_mutex_unlock(&myMutex);
break; // Terminate the program when myCount reaches 0
}
pthread_mutex_unlock(&myMutex);
printf("CONSUMER: myMutex unlocked\n");
}
return NULL;
}