Linux信号量生产者消费者
时间: 2023-10-18 09:27:11 浏览: 97
Linux信号量可以用来实现生产者-消费者模型,保证生产者和消费者之间的同步和互斥。下面是一个基于信号量的生产者-消费者模型的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#define BUFFER_SIZE 10
int buffer[BUFFER_SIZE];
sem_t empty, full;
pthread_mutex_t mutex;
void *producer(void *arg)
{
int item = 0;
while (1) {
// 等待空闲缓冲区
sem_wait(&empty);
// 获取互斥锁
pthread_mutex_lock(&mutex);
// 生产数据项
item++;
// 将数据项放入缓冲区
buffer[(item - 1) % BUFFER_SIZE] = item;
printf("Produced item %d\n", item);
// 释放互斥锁
pthread_mutex_unlock(&mutex);
// 发送信号通知缓冲区中已有数据
sem_post(&full);
}
}
void *consumer(void *arg)
{
int item;
while (1) {
// 等待缓冲区中有数据
sem_wait(&full);
// 获取互斥锁
pthread_mutex_lock(&mutex);
// 从缓冲区取出数据项
item = buffer[item % BUFFER_SIZE];
printf("Consumed item %d\n", item);
// 释放互斥锁
pthread_mutex_unlock(&mutex);
// 发送信号通知缓冲区有空闲
sem_post(&empty);
}
}
int main(int argc, char *argv[])
{
pthread_t ptid, ctid;
// 初始化信号量和互斥锁
sem_init(&empty, 0, BUFFER_SIZE);
sem_init(&full, 0, 0);
pthread_mutex_init(&mutex, NULL);
// 创建生产者和消费者线程
pthread_create(&ptid, NULL, producer, NULL);
pthread_create(&ctid, NULL, consumer, NULL);
// 等待线程结束
pthread_join(ptid, NULL);
pthread_join(ctid, NULL);
return 0;
}
```
在这个示例中,用两个信号量`empty`和`full`分别表示缓冲区的空闲和有数据状态。生产者线程在生产数据项之前,会等待`empty`信号量,表示缓冲区中有空闲的位置。生产完成后,会释放一个`full`信号量,表示缓冲区中有数据了。消费者线程在消费数据项之前,会等待`full`信号量,表示缓冲区中有数据。消费完成后,会释放一个`empty`信号量,表示缓冲区中有空闲位置了。在生产者和消费者之间,用一个互斥锁`mutex`来保护共享缓冲区的数据。
阅读全文