linux 信号量生产者消费者
时间: 2023-11-10 16:07:16 浏览: 119
Linux 信号量是一种进程间通信机制,用于同步进程间的操作。在生产者消费者问题中,可以使用信号量来实现生产者和消费者之间的同步。
具体实现方法如下:
1. 定义两个信号量:一个用于表示缓冲区中可用的空间数量,另一个用于表示缓冲区中已经存储的数据数量。
2. 生产者在向缓冲区中写入数据之前,需要先获取空闲空间的信号量。如果当前可用空间数量为 0,则生产者需要等待,直到有空闲空间可用。
3. 生产者写入数据后,需要释放已经存储的数据数量的信号量,表示缓冲区中已经存储了新的数据。
4. 消费者在从缓冲区中读取数据之前,需要先获取已经存储的数据数量的信号量。如果当前已经存储的数据数量为 0,则消费者需要等待,直到有数据可读。
5. 消费者读取数据后,需要释放空闲空间的信号量,表示缓冲区中有了新的空闲空间。
下面是一个简单的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <semaphore.h>
#define BUFFER_SIZE 10
int buffer[BUFFER_SIZE];
int in = 0, out = 0;
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[in] = item;
in = (in + 1) % BUFFER_SIZE;
printf("Producer produced item %d\n", item);
pthread_mutex_unlock(&mutex);
// 释放已经存储的数据数量信号量
sem_post(&full);
sleep(1);
}
}
void *consumer(void *arg)
{
int item;
while (1) {
// 等待有数据可读
sem_wait(&full);
pthread_mutex_lock(&mutex);
// 消费数据
item = buffer[out];
out = (out + 1) % BUFFER_SIZE;
printf("Consumer consumed item %d\n", item);
pthread_mutex_unlock(&mutex);
// 释放空闲空间信号量
sem_post(&empty);
sleep(2);
}
}
int main()
{
pthread_t tid1, tid2;
sem_init(&empty, 0, BUFFER_SIZE);
sem_init(&full, 0, 0);
pthread_mutex_init(&mutex, NULL);
pthread_create(&tid1, NULL, producer, NULL);
pthread_create(&tid2, NULL, consumer, NULL);
pthread_join(tid1, NULL);
pthread_join(tid2, NULL);
sem_destroy(&empty);
sem_destroy(&full);
pthread_mutex_destroy(&mutex);
return 0;
}
```
阅读全文