以生产者/消费者模型为依据,在linux环境下创建一个控制台进程,在该进程中创建n个线程模拟生产者和消费者,实现进程(线程)的同步与互斥。
时间: 2024-05-09 10:15:16 浏览: 90
以下是一个基于Linux环境下使用pthread库实现生产者/消费者模型的控制台程序的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
#define BUFFER_SIZE 10
int buffer[BUFFER_SIZE];
int count = 0;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; // 互斥锁
pthread_cond_t full = PTHREAD_COND_INITIALIZER; // 缓冲区满条件变量
pthread_cond_t empty = PTHREAD_COND_INITIALIZER; // 缓冲区空条件变量
void *producer(void *param);
void *consumer(void *param);
int main(int argc, char *argv[]) {
pthread_t tid_producer[5], tid_consumer[5];
int i;
// 创建5个生产者线程和5个消费者线程
for (i = 0; i < 5; i++) {
if (pthread_create(&tid_producer[i], NULL, producer, NULL) != 0) {
perror("pthread_create");
exit(1);
}
if (pthread_create(&tid_consumer[i], NULL, consumer, NULL) != 0) {
perror("pthread_create");
exit(1);
}
}
// 等待所有线程结束
for (i = 0; i < 5; i++) {
if (pthread_join(tid_producer[i], NULL) != 0) {
perror("pthread_join");
exit(1);
}
if (pthread_join(tid_consumer[i], NULL) != 0) {
perror("pthread_join");
exit(1);
}
}
return 0;
}
void *producer(void *param) {
int item;
while (1) {
item = rand() % 100; // 生产一个随机数
pthread_mutex_lock(&mutex); // 加锁
// 如果缓冲区已满,等待消费者消费
while (count == BUFFER_SIZE) {
pthread_cond_wait(&empty, &mutex);
}
buffer[count++] = item; // 将数据放入缓冲区
printf("Producer %u produced item %d\n", (unsigned int)pthread_self(), item);
// 如果缓冲区不为空,通知消费者可以消费
if (count == 1) {
pthread_cond_signal(&full);
}
pthread_mutex_unlock(&mutex); // 解锁
sleep(1); // 随机休眠一段时间
}
}
void *consumer(void *param) {
int item;
while (1) {
pthread_mutex_lock(&mutex); // 加锁
// 如果缓冲区为空,等待生产者生产
while (count == 0) {
pthread_cond_wait(&full, &mutex);
}
item = buffer[--count]; // 从缓冲区取出数据
printf("Consumer %u consumed item %d\n", (unsigned int)pthread_self(), item);
// 如果缓冲区未满,通知生产者可以继续生产
if (count == BUFFER_SIZE - 1) {
pthread_cond_signal(&empty);
}
pthread_mutex_unlock(&mutex); // 解锁
sleep(1); // 随机休眠一段时间
}
}
```
该程序创建了5个生产者线程和5个消费者线程,它们共享一个大小为10的缓冲区。生产者线程每次生产一个随机数并将其放入缓冲区中,消费者线程每次从缓冲区中取出一个数据并消费它。使用互斥锁和条件变量实现了线程之间的同步与互斥。
阅读全文