设计一个生产者-消费者进程同步

时间: 2024-02-23 14:59:49 浏览: 33
生产者-消费者问题是一个经典的多线程同步问题,解决这个问题的方法有多种,其中最常见的方法是使用信号量机制。下面是一个基于信号量的生产者-消费者进程同步的示例代码(使用C语言编写): ``` #include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <semaphore.h> #define BUFFER_SIZE 10 // 缓冲池大小 #define PRODUCER_NUM 5 // 生产者数量 #define CONSUMER_NUM 5 // 消费者数量 #define MAX_SLEEP_TIME 3 // 生产者和消费者的最大睡眠时间 sem_t mutex, empty, full; // 三个信号量 int buffer[BUFFER_SIZE]; // 缓冲池 int in = 0, out = 0; // 缓冲池的读写指针 void *producer(void *arg) { int id = *(int *)arg; while (1) { // 生产者睡眠一段时间 sleep(rand() % MAX_SLEEP_TIME + 1); // 生产一个产品 int product = rand() % 100; // 等待empty信号量 sem_wait(&empty); // 等待mutex信号量 sem_wait(&mutex); // 将产品放入缓冲池 buffer[in] = product; printf("Producer %d produce product %d\n", id, product); in = (in + 1) % BUFFER_SIZE; // 释放mutex信号量 sem_post(&mutex); // 发送full信号量 sem_post(&full); } pthread_exit(NULL); } void *consumer(void *arg) { int id = *(int *)arg; while (1) { // 消费者睡眠一段时间 sleep(rand() % MAX_SLEEP_TIME + 1); // 等待full信号量 sem_wait(&full); // 等待mutex信号量 sem_wait(&mutex); // 从缓冲池中取出一个产品 int product = buffer[out]; printf("Consumer %d consume product %d\n", id, product); out = (out + 1) % BUFFER_SIZE; // 释放mutex信号量 sem_post(&mutex); // 发送empty信号量 sem_post(&empty); } pthread_exit(NULL); } int main() { sem_init(&mutex, 0, 1); sem_init(&empty, 0, BUFFER_SIZE); sem_init(&full, 0, 0); pthread_t producers[PRODUCER_NUM], consumers[CONSUMER_NUM]; int producer_ids[PRODUCER_NUM], consumer_ids[CONSUMER_NUM]; // 创建生产者线程 for (int i = 0; i < PRODUCER_NUM; i++) { producer_ids[i] = i; pthread_create(&producers[i], NULL, producer, &producer_ids[i]); } // 创建消费者线程 for (int i = 0; i < CONSUMER_NUM; i++) { consumer_ids[i] = i; pthread_create(&consumers[i], NULL, consumer, &consumer_ids[i]); } // 等待所有线程退出 for (int i = 0; i < PRODUCER_NUM; i++) { pthread_join(producers[i], NULL); } for (int i = 0; i < CONSUMER_NUM; i++) { pthread_join(consumers[i], NULL); } sem_destroy(&mutex); sem_destroy(&empty); sem_destroy(&full); return 0; } ``` 在上面的代码中,我们定义了三个信号量:mutex、empty和full。mutex信号量用于互斥地访问缓冲池,empty信号量用于表示缓冲池中还有多少空位可以放置产品,full信号量用于表示缓冲池中还有多少产品可以被消费。每个生产者线程在生产一个产品之前先等待empty信号量,表示缓冲池中还有空位可以放置产品;然后等待mutex信号量,表示它要进入临界区(访问缓冲池);在生产完一个产品后,释放mutex信号量,表示它退出临界区;最后发送full信号量,表示缓冲池中又多了一个产品可以被消费。每个消费者线程在消费一个产品之前先等待full信号量,表示缓冲池中有产品可以被消费;然后等待mutex信号量,表示它要进入临界区(访问缓冲池);在消费完一个产品后,释放mutex信号量,表示它退出临界区;最后发送empty信号量,表示缓冲池中又多了一个空位可以放置产品。这样,就可以保证生产者和消费者之间的同步和互斥了。

相关推荐

最新推荐

recommend-type

用多线程同步方法解决生产者-消费者问题

1.每个生产者和消费者对有界缓冲区进行操作后,即时显示有界缓冲区的全部内容、当前指针位置和生产者/消费者线程的标识符; 2.生产者和消费者各有两个以上; 3.多个生产者或多个消费者之间须共享对缓冲区进行...
recommend-type

生产者与消费者问题(进程同步,会计与出纳问题)含完整课程设计报告

通过在java环境中定义两个线程:“会计”和“出纳”来模拟进程间的通信和同步,并且定义一个缓冲区作为模拟账本,从而实现生产者与消费者问题。在程序的结尾,我加了一个线程的循环周期,设置为10次。如果不加循环...
recommend-type

生产者消费者问题java的java编写的

设计目的:通过研究Linux 的进程机制和信号量实现生产者消费者问题的并发控制. 说明:有界缓冲区内设有20个存储单元,放入/取出的数据项设定为1-20这20个整型数. 设计要求:(1)每个生产者和消费者对有界缓冲区进行操作后...
recommend-type

网络编程网络编程网络编程

网络编程网络编程网络编程网络编程
recommend-type

setuptools-5.4.zip

Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

用 Python 画一个可以动的爱心

好的,我可以帮助您使用Python来绘制一个动态的爱心。您可以使用turtle库来实现。以下是实现代码: ```python import turtle import math # 设置画布和画笔 canvas = turtle.Screen() canvas.bgcolor("black") pencil = turtle.Turtle() pencil.speed(0) pencil.color("red", "pink") pencil.pensize(3) # 定义爱心函数 def draw_love(heart_size, x_offset=0, y_offset=0):
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。