用共享内存的方法实现多线程生产者消费者
时间: 2024-03-07 11:49:54 浏览: 20
实现多线程生产者消费者问题的方法有很多种,其中一种是使用共享内存。下面是一个简单的示例程序:
```c
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#include <sys/mman.h>
#include <fcntl.h>
#define SHM_NAME "/shm_example"
#define SHM_SIZE 1024
int *buffer;
sem_t *empty;
sem_t *full;
sem_t *mutex;
void *producer(void *arg) {
int item = 0;
while (1) {
sem_wait(empty);
sem_wait(mutex);
buffer[item] = rand() % 100;
printf("Producer produced item: %d\n", buffer[item]);
item = (item + 1) % SHM_SIZE;
sem_post(mutex);
sem_post(full);
}
return NULL;
}
void *consumer(void *arg) {
int item = 0;
while (1) {
sem_wait(full);
sem_wait(mutex);
printf("Consumer consumed item: %d\n", buffer[item]);
buffer[item] = 0;
item = (item + 1) % SHM_SIZE;
sem_post(mutex);
sem_post(empty);
}
return NULL;
}
int main() {
int shm_fd = shm_open(SHM_NAME, O_CREAT | O_RDWR, 0666);
ftruncate(shm_fd, SHM_SIZE * sizeof(int));
buffer = mmap(NULL, SHM_SIZE * sizeof(int), PROT_READ | PROT_WRITE, MAP_SHARED, shm_fd, 0);
empty = sem_open("/sem_empty", O_CREAT, 0666, SHM_SIZE);
full = sem_open("/sem_full", O_CREAT, 0666, 0);
mutex = sem_open("/sem_mutex", O_CREAT, 0666, 1);
pthread_t producer_thread, consumer_thread;
pthread_create(&producer_thread, NULL, producer, NULL);
pthread_create(&consumer_thread, NULL, consumer, NULL);
pthread_join(producer_thread, NULL);
pthread_join(consumer_thread, NULL);
sem_close(empty);
sem_close(full);
sem_close(mutex);
sem_unlink("/sem_empty");
sem_unlink("/sem_full");
sem_unlink("/sem_mutex");
shm_unlink(SHM_NAME);
return 0;
}
```
在此示例程序中,我们使用了共享内存来存储生产者和消费者之间的数据缓冲区。我们还使用了三个信号量:empty、full 和 mutex。empty 信号量表示缓冲区中空闲的槽位数量,full 信号量表示缓冲区中已经填充的槽位数量,mutex 信号量用于实现互斥访问。
生产者线程和消费者线程都会不断地循环,生产者线程会先等待 empty 信号量,然后等待 mutex 信号量,生产一个随机数并将其放入缓冲区中,最后释放 mutex 信号量和 full 信号量。消费者线程也是先等待 full 信号量,然后等待 mutex 信号量,从缓冲区中取出一个随机数并将其清零,最后释放 mutex 信号量和 empty 信号量。
在主函数中,我们创建了共享内存、信号量和两个线程,然后等待线程结束。最后,我们关闭信号量和删除共享内存和信号量。
注意,这只是一个简单的示例程序,实际应用中可能需要更复杂的同步机制,以确保生产者和消费者线程之间的正确交互。