Linux下生产者与消费者模型的C语言实现
在Linux环境下,实现经典的生产者与消费者模型,我们可以通过C语言实现一个多线程的示例代码,以解决线程之间的同步和互斥问题。以下代码翻译自Windows下的生产者与消费者模式并进行了注释。
示例代码
#include
#include
#include
#include
#define BUFFER_SIZE 5
int buffer[BUFFER_SIZE];
int count = 0;
sem_t empty;
sem_t full;
pthread_mutex_t mutex;
void *producer(void *param) {
int item;
while (1) {
item = rand() 0;
sem_wait(∅);
pthread_mutex_lock(&mutex);
// 将数据放入缓冲区
buffer[count++] = item;
printf("生产者生产了: %d
", item);
pthread_mutex_unlock(&mutex);
sem_post(&full);
}
}
void *consumer(void *param) {
int item;
while (1) {
sem_wait(&full);
pthread_mutex_lock(&mutex);
// 从缓冲区读取数据
item = buffer[--count];
printf("消费者消费了: %d
", item);
pthread_mutex_unlock(&mutex);
sem_post(∅);
}
}
int main() {
pthread_t prod_tid, cons_tid;
// 初始化信号量
sem_init(∅, 0, BUFFER_SIZE);
sem_init(&full, 0, 0);
pthread_mutex_init(&mutex, NULL);
// 创建生产者和消费者线程
pthread_create(∏_tid, NULL, producer, NULL);
pthread_create(&cons_tid, NULL, consumer, NULL);
// 等待线程结束
pthread_join(prod_tid, NULL);
pthread_join(cons_tid, NULL);
// 销毁信号量和互斥锁
sem_destroy(∅);
sem_destroy(&full);
pthread_mutex_destroy(&mutex);
return 0;
}
代码解析
- 缓冲区:定义了一个大小为5的缓冲区,用于存储生产者生产的物品。
- 信号量和互斥锁:
sem_t empty
:表示空缓冲区的数量。sem_t full
:表示满缓冲区的数量。pthread_mutex_t mutex
:用于确保线程安全,避免生产者和消费者同时操作缓冲区。
- 生产者函数:不断生成随机数(模拟生产),并将其放入缓冲区。
- 消费者函数:从缓冲区取出数据(模拟消费),并打印。
此实现展示了如何在Linux环境下通过线程和信号量控制生产者与消费者问题的同步性和互斥性。
4.69KB
文件大小:
评论区