使用c++语言生成一个生产者进程与多个消费者进程同步工作的源代码
时间: 2024-04-30 21:17:41 浏览: 26
以下是使用C语言实现生产者消费者问题的源代码,其中包括一个生产者进程和多个消费者进程,它们使用信号量和共享内存实现同步工作:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <semaphore.h>
#include <sys/mman.h>
#include <sys/wait.h>
#define SHM_NAME "/buffer_shm"
#define SEM_MUTEX_NAME "/mutex_sem"
#define SEM_EMPTY_NAME "/empty_sem"
#define SEM_FULL_NAME "/full_sem"
#define BUFFER_SIZE 10
#define NUM_CONSUMERS 3
typedef struct {
int buffer[BUFFER_SIZE];
int in;
int out;
} buffer_t;
int main()
{
int i, j, pid;
int shm_fd;
sem_t *mutex_sem, *empty_sem, *full_sem;
buffer_t *buffer;
// 创建共享内存区域
shm_fd = shm_open(SHM_NAME, O_CREAT | O_RDWR, 0666);
ftruncate(shm_fd, sizeof(buffer_t));
buffer = mmap(NULL, sizeof(buffer_t), PROT_READ | PROT_WRITE, MAP_SHARED, shm_fd, 0);
// 初始化信号量
mutex_sem = sem_open(SEM_MUTEX_NAME, O_CREAT | O_EXCL, 0666, 1);
empty_sem = sem_open(SEM_EMPTY_NAME, O_CREAT | O_EXCL, 0666, BUFFER_SIZE);
full_sem = sem_open(SEM_FULL_NAME, O_CREAT | O_EXCL, 0666, 0);
// 创建消费者进程
for (i = 0; i < NUM_CONSUMERS; i++) {
pid = fork();
if (pid == 0) {
for (j = 0; j < 10; j++) {
sem_wait(full_sem);
sem_wait(mutex_sem);
int item = buffer->buffer[buffer->out];
buffer->out = (buffer->out + 1) % BUFFER_SIZE;
printf("Consumer %d consumes item %d\n", i, item);
sem_post(mutex_sem);
sem_post(empty_sem);
}
exit(0);
}
}
// 生产者进程
for (i = 0; i < 30; i++) {
sem_wait(empty_sem);
sem_wait(mutex_sem);
buffer->buffer[buffer->in] = i;
buffer->in = (buffer->in + 1) % BUFFER_SIZE;
printf("Producer produces item %d\n", i);
sem_post(mutex_sem);
sem_post(full_sem);
}
// 等待消费者进程结束
for (i = 0; i < NUM_CONSUMERS; i++) {
wait(NULL);
}
// 关闭和删除信号量和共享内存
sem_close(mutex_sem);
sem_close(empty_sem);
sem_close(full_sem);
sem_unlink(SEM_MUTEX_NAME);
sem_unlink(SEM_EMPTY_NAME);
sem_unlink(SEM_FULL_NAME);
munmap(buffer, sizeof(buffer_t));
shm_unlink(SHM_NAME);
return 0;
}
```
在这个程序中,我们定义了一个`buffer_t`结构体,其中包含一个循环缓冲区和两个指针,分别指向缓冲区的头部和尾部。我们还定义了三个信号量,分别用于互斥、空缓冲区和满缓冲区的同步。
我们首先创建共享内存区域,然后使用`mmap`将其映射到当前进程的地址空间中。接着初始化三个信号量,其中互斥信号量的初始值为1,空缓冲区和满缓冲区的初始值分别为缓冲区大小和0。然后我们创建多个消费者进程,每个消费者进程都会循环消费10个物品,从缓冲区中取出一个物品并打印出来。最后我们创建一个生产者进程,它循环生产30个物品,将它们放入缓冲区中并打印出来。当生产者进程完成生产后,它会等待所有消费者进程结束。最后我们关闭和删除信号量和共享内存。
这个程序使用信号量和共享内存实现了生产者消费者问题的同步,确保生产者不会向满缓冲区中添加物品,消费者不会从空缓冲区中取出物品。同时它还使用了循环缓冲区,使得生产者和消费者可以循环地使用缓冲区,而不需要重新分配和释放内存。
相关推荐
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![txt](https://img-home.csdnimg.cn/images/20210720083642.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)