进程同步生产者与消费者c
时间: 2023-10-21 10:05:21 浏览: 93
进程同步之生产者和消费者
5星 · 资源好评率100%
在C语言中,可以使用信号量(Semaphore)来实现进程同步。以下是一个基于信号量的生产者消费者模型的示例代码:
```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, mutex;
int in = 0, out = 0;
void *producer(void *arg);
void *consumer(void *arg);
int main(int argc, char *argv[]) {
sem_init(&empty, 0, BUFFER_SIZE);
sem_init(&full, 0, 0);
sem_init(&mutex, 0, 1);
pthread_t tid1, tid2;
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);
sem_destroy(&mutex);
return 0;
}
void *producer(void *arg) {
int item;
for (int i = 0; i < 10; i++) {
item = rand() % 100; // 随机生成生产的数据
sem_wait(&empty);
sem_wait(&mutex);
buffer[in] = item;
in = (in + 1) % BUFFER_SIZE;
printf("Producer produced %d\n", item);
sem_post(&mutex);
sem_post(&full);
}
pthread_exit(NULL);
}
void *consumer(void *arg) {
int item;
for (int i = 0; i < 10; i++) {
sem_wait(&full);
sem_wait(&mutex);
item = buffer[out];
out = (out + 1) % BUFFER_SIZE;
printf("Consumer consumed %d\n", item);
sem_post(&mutex);
sem_post(&empty);
}
pthread_exit(NULL);
}
```
在该代码中,使用了三个信号量empty、full和mutex。empty表示缓冲区中空槽的数量,full表示缓冲区中满槽的数量,mutex用于保护缓冲区的访问。在生产者和消费者线程中,使用sem_wait()和sem_post()函数对信号量进行操作,当empty和full的值为0时,线程会被阻塞,直到有空槽或满槽可用;当mutex的值为0时,线程也会被阻塞,直到其他线程释放了mutex。在生产者线程中,每次生成一个数据后,会将empty信号量的值减1,并将数据存储到缓冲区中;在消费者线程中,每次从缓冲区中取出一个数据后,会将full信号量的值减1,并将数据消费掉。通过使用信号量,可以保证生产者和消费者的操作是互斥的,且不会发生缓冲区溢出或下溢的情况。
阅读全文