首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

只使用互斥锁和信号量的生产者-消费者同步(无pthread_cond)

生产者-消费者问题是一个经典的并发编程问题,通常涉及多个线程或进程之间的同步和通信。在这个问题中,生产者线程负责生成数据并将其放入共享缓冲区,而消费者线程则从缓冲区中取出数据并进行处理。为了确保线程安全,通常需要使用同步机制,如互斥锁(mutex)和信号量(semaphore)。

基础概念

  1. 互斥锁(Mutex)
    • 互斥锁是一种同步机制,用于保护共享资源,防止多个线程同时访问。
    • 当一个线程获得互斥锁时,其他试图获得该锁的线程将被阻塞,直到锁被释放。
  • 信号量(Semaphore)
    • 信号量是一种计数器,用于控制多个线程对共享资源的访问。
    • 它有两个基本操作:P(等待)和V(释放)。P操作会减少信号量的值,如果值为零则阻塞线程;V操作会增加信号量的值,并唤醒一个等待的线程。

类型与应用场景

  • 生产者-消费者模型广泛应用于多线程编程、操作系统、数据库系统等领域。
  • 这种模型可以有效地利用多核处理器的并行处理能力,提高系统的吞吐量和响应速度。

示例代码

以下是一个使用互斥锁和信号量实现的生产者-消费者模型的示例代码(假设使用C语言):

代码语言:txt
复制
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>

#define BUFFER_SIZE 10

int buffer[BUFFER_SIZE];
int in = 0;
int out = 0;

sem_t empty;
sem_t full;
pthread_mutex_t mutex;

void* producer(void* arg) {
    int item, i;
    for (i = 0; i < 20; i++) {
        item = i; // 生产数据

        sem_wait(&empty); // 等待空闲缓冲区
        pthread_mutex_lock(&mutex); // 获取互斥锁

        buffer[in] = item;
        in = (in + 1) % BUFFER_SIZE;
        printf("Produced: %d\n", item);

        pthread_mutex_unlock(&mutex); // 释放互斥锁
        sem_post(&full); // 增加满缓冲区计数
    }
    return NULL;
}

void* consumer(void* arg) {
    int item, i;
    for (i = 0; i < 20; i++) {
        sem_wait(&full); // 等待满缓冲区
        pthread_mutex_lock(&mutex); // 获取互斥锁

        item = buffer[out];
        out = (out + 1) % BUFFER_SIZE;
        printf("Consumed: %d\n", item);

        pthread_mutex_unlock(&mutex); // 释放互斥锁
        sem_post(&empty); // 增加空闲缓冲区计数
    }
    return NULL;
}

int main() {
    pthread_t producer_thread, consumer_thread;

    sem_init(&empty, 0, BUFFER_SIZE);
    sem_init(&full, 0, 0);
    pthread_mutex_init(&mutex, NULL);

    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_destroy(&empty);
    sem_destroy(&full);
    pthread_mutex_destroy(&mutex);

    return 0;
}

可能遇到的问题及解决方法

  1. 死锁
    • 原因:线程在获取多个锁时顺序不当,导致互相等待。
    • 解决方法:确保所有线程以相同的顺序获取锁。
  • 饥饿
    • 原因:某些线程长时间无法获得所需的资源。
    • 解决方法:使用公平的调度策略,确保每个线程都有机会获得资源。
  • 竞态条件
    • 原因:多个线程对共享资源的访问顺序不确定,导致结果不可预测。
    • 解决方法:使用互斥锁保护共享资源的访问。

通过合理使用互斥锁和信号量,可以有效地解决生产者-消费者问题中的同步和并发问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【Linux】从多线程同步到生产者消费者模型:多线程编程实践

1个交易场指的就是共享资源(临界资源),有多个厂商(生产者)和多个用户(消费者),所以这就是我们常说的多线程的同步和互斥问题。 超市是什么?临时保存数据的“内存空间”——某种数据结构对象。...2.2.生产者消费者模型优点 解耦 支持并发 支持忙闲不均 2.3.为何要使用生产者消费者模型 生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题。...如果生产者只生产了一份,但是叫醒了5个消费者,当一个消费者竞争锁结束取走仅有的一份商品,那接下来的4个消费者就会看到空的队列,如果是if,因为之前已经判断过,所以会直接执行下面取空的队列,因此会直接报错...POSIX信号量和SystemV信号量作用相同,都是用于同步操作,达到无冲突的访问共享资源目的。 但POSIX可以用于线程间同步。...当然生产者不能把消费者套一个圈,消费者不能超过生产者。这些都可以通过POSIX信号量的特性实现~ 5.2.环形队列的具体实现 首先需要区分生产者和消费者,生产者只关注空间,消费者只关注资源。

9910

【Linux】线程同步

所以生产者消费者模型会有三种关系,分别是: 生产者和生产者,它们之间是互斥关系 生产者和消费者,它们之间是互斥和同步的关系 消费者和消费者,它们之间是互斥关系 除此之外,生产者消费者模型的两中角色分别是生产者和消费者...其实 POSIX 信号量 和我们以前学的 SystemV 信号量 是一样的。它们的作用相同,都是用于同步操作,达到无冲突的访问共享资源目的。 但 POSIX 可以用于线程间同步。...我们在环形队列中引入生产者和消费者模型,这些多线程就要在一个环形队列中进行生产和消费的动作,所以生产者和生产者,消费者和消费者,必须都是各自互斥,生产和消费也必须有互斥和同步的关系。...由于生产者和消费者之间的互斥关系已经由信号量维护了,那么在多线程情况下,生产者和生产者之间的互斥关系,消费者和消费者之间的互斥关系,怎么维护呢?...一共要使用两把锁,一把维护生产者线程之间的互斥关系,另一把维护消费者线程之间的互斥关系! 那么加锁是在申请信号量之前还是之后呢?在申请信号量之后!

15410
  • 信号量与管程以及原子性,pv原语操作,临界资源和临界区,同步和互斥,信号量,管程与临界区不同,信号量和互斥锁的区别,互斥量(Mutex)

    和用软件实现的同步比较,软件同步是平等线程间的的一种同步(sync,锁机制)协商机制,不能保证原子性。而信号量则由操作系统进行管理,地位高于进程,操作系统保证信号量的原子性。...信号量是跟锁机制在同一个层次上的编程方法。 管程是为了解决信号量在临界区的PV操作上的配对的麻烦,把配对的PV操作集中在一起,生成的一种并发编程方法。其中使用了条件变量这种同步机制。...3)条件变量   一个条件变量就对应于一个等待队列,每个条件变量有一个Wait()操作和Signal()操作 4)用管程实现生产者-消费者问题  先进入管程,再进行判断。...五、读者写者问题 信号量和互斥锁的区别 1. 互斥量用于线程的互斥,信号量用于线程的同步。 这是互斥量和信号量的根本区别,也就是互斥和同步之间的区别。...互斥锁和条件变量,同步方式侧重于”等待”操作,即资 源不可用的话 信号灯机制,则侧重于点灯,即告知资源可用; 没有等待线程的解锁或激发条件都是没有意义的,而没有等待灯亮的线程的点灯操作则有效,且能保持

    14510

    什么是线程安全?一文带你深入理解

    锁的实现方式又分为「忙等待锁」和「无忙等待锁」 忙等锁 检查并设置(test-and-set-lock,TSL)是一种不可中断的原子运算,它属于原子操作指令,可以通过它来实现忙等锁(自旋锁)。...信号量等于 0 时,代表无资源可用 信号量小于 0 时,代表有线程在阻塞 信号量大于 0 时,代表资源可用 使用伪代码实现P V 信号量 ?...实践 信号量还是比较有意思的,这里来做几个实践,加深大家对信号量的理解,实践的内容分别是 信号量实现互斥 信号量实现事件同步 信号量实现生产者与消费者 互斥 使用信号量实现互斥非常简单,信号量数量为...生产者与消费者是一个比较经典的线程同步问题,我们先分析下有那些角色 生产者:生产事件放入缓冲区 消费者:从缓冲区消费事件 缓冲区:装载事件的容器 ?...个信号量 互斥信号量:互斥访问缓冲区,初始化 1 消费者资源信号量:缓冲区是否有事件,初始化 0,无事件 生产者信号量:缓冲区是否有空位装载事件,初始化 N (缓冲区大小) 伪代码如下 ?

    65131

    【地铁上的面试题】--基础部分--操作系统--程同步与通信

    解决方案:生产者消费者问题可以使用多种方法来解决,以下是两种常见的解决方案: 使用条件变量和互斥锁: 定义一个缓冲区作为数据的共享区域,同时定义一个互斥锁来保护对缓冲区的访问。...生产者生成数据后,放入缓冲区,发送信号给消费者条件变量,释放互斥锁。 消费者从缓冲区取出数据,发送信号给生产者条件变量,释放互斥锁。 使用信号量: 定义一个缓冲区作为数据的共享区域。...消费者从缓冲区取出数据,减少可用数据信号量,增加空闲空间信号量。 以上是两种常见的解决方案,可以根据具体情况选择适合的方法来实现生产者消费者问题的同步和互斥。...第一种方案使用条件变量和互斥锁来保证生产者和消费者之间的同步和互斥,通过条件变量和互斥锁来实现对缓冲区的访问控制。...无论是使用条件变量和互斥锁还是信号量,这些解决方案都可以有效地解决生产者消费者问题,保证数据的安全性和协作的正确性。在实际应用中,可以根据具体情况选择适合的方案来实现进程同步与通信。

    25220

    Linux多线程【生产者消费者模型】

    ,但在当前代码设计中(使用同一个 _queue),完全没有必要 以上就是关于 基于阻塞队列实现「生产者消费者模型」的全部内容了,除了使用互斥锁外,还可以使用信号量,也就是使用环形队列来实现 「生产者消费者模型...」 3、POSIX 信号量 3.1、信号量的基本知识 互斥、同步 不只能通过 互斥锁、条件变量 实现,还能通过 信号量 sem、互斥锁 实现(出自 POSIX 标准) 「信号量」 的本质就是一个 计数器...「信号量」 本身就是一个天然的计数器 在 环形队列 中,生产者 和 消费者 关心的资源不一样:生产者只关心是否有空间放数据,消费者只关心是否能从空间中取到数据 除非两者相遇,其他情况下生产者、消费者可以并发运行...忘记张三和李四的小游戏,将 环形队列 的运行模式带入 「生产者消费者模型」 可以使用 「信号量」 标识资源的使用情况,但生产者和消费者关注的资源并不相同,所以需要使用两个 「信号量」 来进行操作 生产者信号量...(信号量实现) 内部同步机制 使用互斥锁或类似的锁机制来实现线程安全 使用信号量来实现线程安全 阻塞操作 支持阻塞操作,当队列为空或已满时,线程可以等待 也支持阻塞操作,当队列为空或已满时,线程可以等待

    56730

    【愚公系列】软考中级-软件设计师 026-操作系统(进程管理-信号量PV操作)

    3.生产者和消费者生产者消费者问题是一个经典的进程同步问题,描述了多个生产者和消费者共享一个有限缓冲区的情况。在生产者消费者问题中,生产者负责将数据放入缓冲区,而消费者负责从缓冲区中取出数据。...缓冲区有一定的容量,当缓冲区已满时,生产者必须等待,当缓冲区为空时,消费者必须等待。为了实现生产者和消费者的同步,可以使用信号量或互斥锁来解决问题。...生产者进程执行以下步骤:等待空槽信号量,如果缓冲区已满则等待。获取互斥锁,保护对缓冲区的访问。将数据放入缓冲区。释放互斥锁。增加满槽信号量。...消费者进程执行以下步骤:等待满槽信号量,如果缓冲区为空则等待。获取互斥锁,保护对缓冲区的访问。从缓冲区取出数据。释放互斥锁。增加空槽信号量。...通过使用互斥锁和信号量来控制生产者和消费者的访问,可以确保数据的正确性和同步。但需要注意的是,在实现过程中需要处理好各种边界条件,以避免死锁或竞争条件的发生。

    71411

    多个线程为了同个资源打起架来了,该如何让他们安分?

    互斥 另外,说一下互斥也并不是只针对多线程。在多进程竞争共享资源的时候,也同样是可以使用互斥的方式来避免资源竞争造成的资源混乱。 同步的概念 互斥解决了并发进程/线程对临界区的使用问题。...B 不能在同一时刻执行」; ---- 互斥与同步的实现和使用 在进程/线程并发执行的过程中,进程/线程之间存在协作的关系,例如有互斥、同步的关系。...信号量不仅可以实现临界区的互斥访问控制,还可以线程间的事件同步。 我们先来说说如何使用信号量实现临界区的互斥访问。 为每类共享资源设置一个信号量 s,其初值为 1,表示该临界资源未被占用。...通过互斥信号量的方式,就能保证临界区任何时刻只有一个线程在执行,就达到了互斥的效果。 再来,我们说说如何使用信号量实现事件同步。 同步的方式是设置一个信号量,其初值为 0。...说明生产者和消费者需要同步。

    59830

    操作系统:第二章 进程的描述与控制(下)

    ; if(temp == false) break; } } Lock::release(){ value = 0; } 利用ts指令实现无忙等待锁 无忙等待锁的基本思想和自旋锁是一样的...2.5.1 生产者-消费者问题 1.问题描述 有两个进程,一组生产者进程和一组消费者进程共享一个初始为空、固定大小为n的缓存(缓冲区)。...生产者和消费者对缓冲区互斥访问是互斥关系(异步的),同时生产者和消费者又是一个相互协作的关系,只有生产者生产之后,消费者才能消费,他们也是同步关系。...如生产者-消费者问题的有界缓冲区。由程序员负责公用数据结构的设置及对进程间同步的处理,操作系统只提供共享存储器。通信效率低,只适合传递相对少量的数据,属于低级通信。...} PCB中有关通信的数据项: 应该在进程的PCB中增加消息队列队首指针,用于对消息队列进行操作,以及用于实现同步的互斥信号量mutex和信号量sm。

    65410

    多个线程为了同个资源打起架来了,操作系统是如何让他们安分的?

    互斥 另外,说一下互斥也并不是只针对多线程。在多进程竞争共享资源的时候,也同样是可以使用互斥的方式来避免资源竞争造成的资源混乱。 同步的概念 互斥解决了并发进程/线程对临界区的使用问题。...B 不能在同一时刻执行」; ---- 互斥与同步的实现和使用 在进程/线程并发执行的过程中,进程/线程之间存在协作的关系,例如有互斥、同步的关系。...信号量不仅可以实现临界区的互斥访问控制,还可以线程间的事件同步。 我们先来说说如何使用信号量实现临界区的互斥访问。 为每类共享资源设置一个信号量 s,其初值为 1,表示该临界资源未被占用。...通过互斥信号量的方式,就能保证临界区任何时刻只有一个线程在执行,就达到了互斥的效果。 再来,我们说说如何使用信号量实现事件同步。 同步的方式是设置一个信号量,其初值为 0。...说明生产者和消费者需要同步。

    1.2K30

    linux网络编程之posix 线程(三):posix 匿名信号量与互斥锁 示例生产者--消费者问题

    命名信号量用于不共享内存的进程间同步(内核实现),类似system v 信号量。...下面使用posix 信号量和互斥锁一起来演示: #include  #include  #include  #include 同步,现在上述程序生产者消费者各一个线程,但生产者睡眠时间是消费者的5倍,故消费者会经常阻塞在...sem_wait(&g_sem_empty) 上面,因为缓冲区经常为空,可以将PRODUCTORS_COUNT 改成5,即有5个生产者线程和1个消费者线程,而且生产者睡眠时间还是消费者的5倍,从动态输出可以看出...四、自旋锁和读写锁简介 (一)、自旋锁 自旋锁类似于互斥锁,它的性能比互斥锁更高。

    1.6K00

    【愚公系列】软考高级-架构设计师 017-进程管理

    信号量(Semaphores): 信号量是一种更通用的同步机制,可以用于互斥和协调多个进程的执行。在互斥使用场景中,通常初始化为1的信号量可以作为二元信号量或互斥锁使用。...避免死锁:合理使用互斥信号量可以帮助避免死锁,尤其是在每个临界区外只使用一个信号量的情况下。 互斥信号量是并发编程中一个非常重要的工具,帮助开发者在多线程和多进程环境中安全地管理对临界资源的访问。...工作原理 同步信号量通常用来解决生产者-消费者问题,其中生产者和消费者需要协调它们对共享资源(如缓冲区)的访问。...如果有其他进程或线程因等待这个信号量而被阻塞,它们中的一个将被唤醒。 例子:使用同步信号量解决生产者-消费者问题 假设有一个固定大小的缓冲区,生产者向缓冲区中放入数据,消费者从缓冲区中取出数据。...3.生产者和消费者 3.1 概念 经典问题:生产者和消费者的问题 三个信号量:互斥信号量S0(仓库独立使用权),同步信号量S1(仓库空闲位置),同步信号量S2(仓库商 品个数)。

    13521

    17-生产者与消费者问题

    生产者与消费者问题 系统中有一组生产者进程和一组消费者进程,生产者进程每次生产一个产品就放入缓冲区,消费者进程每次从缓冲区中取出一个产品并使用(这里的产品可能是某种数据) 生产者和消费者共享一个初始为空...信号量机制可以实现互斥,同步以及对一类资源的申请和释放 互斥:一般会设置初值为1的互斥信号量 同步:设置初值为0的同步信号量(实现一前一后) 资源的释放和申请:设置一个信号量,初始值即为资源数量(本质还是进程同步...) PV操作题目分析步骤 关系分析,找出题目中描述的各个进程,分析它们之间的同步互斥关系 本题中,涉及以下几种进程同步,互斥关系 互斥关系:对于临界区的访问,必须互斥进行 同步关系:缓冲区满,生产者必须开始等待...使mutex变为0 由于没有空闲缓冲区,所以生产者被阻塞 消费者进程执行,由于mutex=0,即生产者还没有释放临界资源的“锁”,所以消费者也被阻塞 生产者等待消费者释放空闲缓冲区,消费者等待生产者释放临界区资源...关系分析,找出题目中各个进程以及它们之间的同步互斥关系 可以看到,这个题目中父亲和母亲相当于两个生产者进程,女儿和儿子相当于两个消费者进程 只不过要注意这里的两个生产者生产物品不同,消费者消费的物品也不同

    59910

    进程同步经典示例 多线程上篇(五)

    生产者消费者 ---- 生产者-消费者(producer-consumer)问题是一个著名的进程同步问题。它描述的是: 有一群生产者进程在生产产品,并将这些产品提供给消费者进程去消费。...尽管所有的生产者进程和消费者进程都是以异步方式运行的,但它们之间必须保持同步 也就是即不允许消费者进程到一个空缓冲区去取产品,也不允许生产者进程向一个已装满产品且尚未被取走的缓冲区中投放产品。...---- 记录型信号量 对于缓冲池本身,可以借助一个互斥信号量mutex实现各个进程对缓冲池的互斥使用; 生产者关注于缓冲池空位子的个数,消费者关注的是缓冲池中被放置好产品的满的个数 ?...} while(TRUE); } //主程序 void main() { proceducer(); consumer(); } 以上就是一个记录型信号量解决生产者消费者的问题的思路 对于信号量中用于实现互斥的...记录型信号量机制 读和写之间是互斥的,所以需要一个信号量用于读写互斥Wmutex 另外如果有读的进程存在,另外的进程如果想要读的话,不需要同步也就是Wait(Wmutex)操作; 如果当前没有进程在读

    1.1K30

    『操作系统』 进程的描述与控制 Part2 进程同步

    信号量集 2.5 经典的进程同步问题 生产者-消费者问题 问题描述: 1.利用记录型信号量解决生产者—消费者问题 练习题 读者-写者问题 问题描述: 解法一 常规解法 2.利用信号量集解决读者...互斥进程彼此在逻辑上是完全无关的 它们的运行不具有时间次序的特征 2、临界资源 一次仅允许一个进程使用的共享资源 生产者—消费者问题: 有一群生产者进程生产产品供给消费者进程消费; 为使两者并发执行...1.利用记录型信号量解决生产者—消费者问题 假定在生产者和消费者之间的公用缓冲池具有n个缓冲区; 可利用互斥信号量mutex实现诸进程对缓冲池的互斥使用; 利用信号量empty和full分别表示缓冲池中空缓冲区和满缓冲区的数量...; 假定这些生产者和消费者相互等效且互斥使用缓冲池。...在生产者/消费者问题中,用s表示实施互斥的信号量,e表示与缓冲区空闲空间数量相关的信号量,n表示与缓冲区中数据项个数相关的信号量,下列生产者和消费者的操作(生产者和消费者可并发执行),不可能产生死锁的是

    1.3K20

    【Linux】互斥锁、基于阻塞队列、环形队列的生产消费模型、单例线程池

    生产者消费者模型: 生产者和生产者:互斥 消费者和消费者:互斥 生产者和消费者:互斥 && 同步 总结:3种关系2种角色1个交易区。...》:上面实现的生产者消费者模型只是单生产单消费,只保证了生产者和消费者之间的互斥关系,如果增加线程让其变成多生产多消费,该如何修改?...事实上我们只需要增加对应的线程即可,因为我们的临界区只用了一把互斥锁保护,生产者和生产者之间,消费者和消费者之间也可以保证互斥的关系。...因为这里信号量本身就是表示资源数目,只要成功,就一定有,不需要判断。 上面已经基本实现了生产者和消费者之间的同步和互斥关系,那么多生产多消费中生产者和生产者,消费者和消费者之间的互斥关系如何保证呢?...事实上上面生产者和消费者之间的同步和互斥关系是通过信号量来保证的,也就是说单生产和单消费这里不需要互斥锁,在这里互斥锁我们只需要用来处理生产者和生产者,消费者和消费者之间的互斥关系就行。

    3600

    操作系统:第二章 进程的描述与控制

    ; if(temp == false) break; } } Lock::release(){ value = 0; } 利用ts指令实现无忙等待锁 无忙等待锁的基本思想和自旋锁是一样的...2.5.1 生产者-消费者问题 1.问题描述 有两个进程,一组生产者进程和一组消费者进程共享一个初始为空、固定大小为n的缓存(缓冲区)。...核心: 能否互斥访问共享资源(不能同时访问共享数据); 当公共容器满时,生产者能否继续生产(生产者应阻塞并唤醒消费者消费); 当公共容器为空时,消费者能否继续消费(消费者应阻塞并唤醒生产者生产)。...生产者和消费者对缓冲区互斥访问是互斥关系(异步的),同时生产者和消费者又是一个相互协作的关系,只有生产者生产之后,消费者才能消费,他们也是同步关系。...如生产者-消费者问题的有界缓冲区。由程序员负责公用数据结构的设置及对进程间同步的处理,操作系统只提供共享存储器。通信效率低,只适合传递相对少量的数据,属于低级通信。

    68130

    C 语言中的生产者-消费者问题

    同步技术 在 C 语言中,可以使用几种同步技术来解决生产者 - 消费者问题,包括: 互斥和条件变量- 互斥提供互斥来保护代码的关键部分,而条件变量允许线程在继续之前等待特定条件满足。...unsetunset两个 C 语言示例代码,用于说明生产者-消费者问题的实现unsetunset 使用具有终止条件的互斥锁和条件变量的有界缓冲区解决方案 例子: #include #...生产者线程生成项目并将其添加到缓冲区,而消费者线程从缓冲区检索和使用项目。互斥锁确保访问缓冲区时的互斥,条件变量(满和空)协调生产者和消费者线程。添加终止条件以限制生产和消费项目的数量。...信号量用于控制对缓冲区的访问并同步生产者和消费者线程。互斥信号量确保互斥,满信号量跟踪缓冲区中的项目数量,空信号量跟踪缓冲区中可用的空槽。添加终止条件以限制生产和消费的项目数量。...通过理解该问题并采用适当的同步技术(例如互斥锁、条件变量、信号量或监视器),可以用 C 编程语言开发出强大的解决方案。这些解决方案允许生产者和消费者和谐地协同工作,确保并发系统中高效的数据生成和消费。

    22010

    【Linux】生产者消费者模型:基于阻塞队列和环形队列 | 单例模式线程池

    关于锁的一些函数 同步 上面可能导致一个问题,当在纯互斥的环境下,可能一个线程对锁的竞争能力很强,导致它释放锁后,又马上申请到了锁,这样就一直是这一个线程持有锁,而其它线程无法申请到锁,也就无法访问临界区...平衡了生产者和消费者的处理能力。...321原则 我们可以把生产者消费者模型简单记成 “321” 原则 3是指有三种关系:消费者和消费者(互斥关系),生产者和生产者(互斥关系),消费者和生产者(互斥和同步关系) 2是指有两个角色:生产者和消费者...,消费者关心的是现有多少数据 生产者和消费者访问下标的行为互斥的,所以需要用到锁 源码RingQueue.hpp #include #include #...自旋锁:把频繁申请访问临界区的锁,称为自旋锁 上文使用的互斥锁。如果申请锁不成功,那就一直被阻塞挂起,直到锁被释放,这种适合,访问临界区时间长的场景。

    35010
    领券