2026/4/4 4:33:03
网站建设
项目流程
网站群发软件,哈尔滨网站制作公司哪家好,网站空间管理面板,免费企业邮箱申请注册各类资料学习下载合集 链接:https://pan.quark.cn/s/770d9387db5f
在多线程编程中,生产者-消费者模型是处理数据流的核心模式。上一篇我们讲了“条件变量+互斥锁”的实现方式,今天我们来解锁一种更轻量级的武器——信号量(Semaphore),并结合环形队列来实现高效的数据吞吐…各类资料学习下载合集链接:https://pan.quark.cn/s/770d9387db5f在多线程编程中,生产者-消费者模型是处理数据流的核心模式。上一篇我们讲了“条件变量+互斥锁”的实现方式,今天我们来解锁一种更轻量级的武器——信号量(Semaphore),并结合环形队列来实现高效的数据吞吐。一、 核心蓝图:双信号量控制在这个模型中,我们不再关注“互斥锁”来保护整个链表,而是关注资源的数量。我们把固定大小的缓冲区看作两类资源:空格子(Blank):供生产者存放数据。产品(Product):供消费者提取数据。1. 信号量定义我们引入两个信号量:blank_number:表示缓冲区中剩余的空闲位置数量。初始值为NUM(例如 5)。product_number:表示缓冲区中已有的产品数量。初始值为0。2. 环形队列(Ring Buffer)为了避免频繁的内存分配与释放(如链表节点),我们使用一个固定大小的全局数组queue[NUM]。通过取模运算i = (i + 1) % NUM,让数组下标首尾相接,形成一个环。二、 生产者实现逻辑生产者的任务是将数据填入空格子。它的逻辑可以概括为:“申请空格 - 生产 - 增加产品”。等待空格 (sem_wait(blank_number)):将blank_number减 1。如果blank_number为 0(说明缓冲区满了),生产者自动阻塞,等待消费者腾出位置。生产产品:将数据写入数组当前位置queue[p]。移动下标p = (p + 1) % NUM。增加产品 (sem_post(product_number)):将product_number加 1。唤醒可能正在等待产品的消费者。三、 消费者实现逻辑消费者的任务是取走产品并腾出空间。它的逻辑概括为:“申请产品 - 消费 - 增加空格”。等待产品 (sem_wait(product_number)):将product_number减 1。如果product_number为 0(说明缓冲区空了),消费者自动阻塞,等待生产者产出。消费产品:读取数组当前位置queue[c]的数据。移动下标c = (c + 1) % NUM。(可选)将原位置清零queue[c] = 0,模拟消费动作。增加空格 (sem_post(blank_number)):将blank_number加 1。唤醒可能正在等待空格的生产者。四、 完整代码实现下面的代码展示了如何使用semaphore.h实现上述逻辑。我们定义缓冲区大小为 5。#includestdio.h#includestdlib.h#includeunistd.h#includepthread.h#includesemaphore.h#include