请帮我写一个生产者-消费者同步与互斥的C++代码 只使用stdio malloc stdbool
时间: 2024-02-28 10:54:51 浏览: 78
好的,以下是一个只使用 stdio、malloc 和 stdbool 的生产者-消费者同步与互斥的C++代码:
```c++
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <pthread.h>
#define BUFFER_SIZE 10 // 缓冲区大小
int buffer[BUFFER_SIZE]; // 缓冲区数组
int in = 0; // 生产者下标
int out = 0; // 消费者下标
bool buffer_is_empty = true; // 缓冲区是否为空
bool buffer_is_full = false; // 缓冲区是否已满
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; // 互斥锁
pthread_cond_t cond_prod = PTHREAD_COND_INITIALIZER; // 生产者条件变量
pthread_cond_t cond_cons = PTHREAD_COND_INITIALIZER; // 消费者条件变量
// 生产者函数
void* producer(void* arg) {
int i;
for (i = 0; i < 10; i++) {
pthread_mutex_lock(&mutex); // 加锁
// 如果缓冲区已满,等待消费者消费
while (buffer_is_full) {
pthread_cond_wait(&cond_prod, &mutex);
}
// 生产一个数据并加入缓冲区
buffer[in] = i;
in = (in + 1) % BUFFER_SIZE;
printf("Producer produced %d\n", i);
// 更新缓冲区状态
buffer_is_empty = false;
buffer_is_full = (in == out);
pthread_mutex_unlock(&mutex); // 解锁
pthread_cond_signal(&cond_cons); // 通知消费者
}
return NULL;
}
// 消费者函数
void* consumer(void* arg) {
int i, data;
for (i = 0; i < 10; i++) {
pthread_mutex_lock(&mutex); // 加锁
// 如果缓冲区为空,等待生产者生产
while (buffer_is_empty) {
pthread_cond_wait(&cond_cons, &mutex);
}
// 从缓冲区中取出一个数据并消费
data = buffer[out];
out = (out + 1) % BUFFER_SIZE;
printf("Consumer consumed %d\n", data);
// 更新缓冲区状态
buffer_is_empty = (in == out);
buffer_is_full = false;
pthread_mutex_unlock(&mutex); // 解锁
pthread_cond_signal(&cond_prod); // 通知生产者
}
return NULL;
}
int main() {
pthread_t tid_prod, tid_cons;
// 创建生产者和消费者线程
pthread_create(&tid_prod, NULL, producer, NULL);
pthread_create(&tid_cons, NULL, consumer, NULL);
// 等待线程结束
pthread_join(tid_prod, NULL);
pthread_join(tid_cons, NULL);
return 0;
}
```
在以上代码中,我们使用了 stdio 的 printf 函数来输出信息,使用了 malloc 函数来动态分配内存(在这个代码中没有使用),使用了 stdbool 的 bool 类型来表示缓冲区的状态。我们定义了互斥锁 `mutex` 和两个条件变量 `cond_prod` 和 `cond_cons`。生产者函数 `producer` 和消费者函数 `consumer` 都是无限循环的,分别等待对方的信号通知。
在生产者函数中,我们首先加锁,然后判断缓冲区是否已满。如果已满,则等待消费者消费,否则生产一个数据并加入缓冲区;接着更新缓冲区状态,解锁并通知消费者。
在消费者函数中,我们首先加锁,然后判断缓冲区是否为空。如果为空,则等待生产者生产,否则从缓冲区中取出一个数据并消费;接着更新缓冲区状态,解锁并通知生产者。
最后,在主函数中,我们创建生产者和消费者线程,等待线程结束。
使用 pthread 库的互斥锁和条件变量可以有效地实现生产者-消费者同步与互斥。
阅读全文