小工具知识网

当前位置: 首页 > 行业知识 > 【Linux】线程同步 -- 条件变量 | 生产者消费者模型 | 自旋锁 |读写锁

行业知识

【Linux】线程同步 -- 条件变量 | 生产者消费者模型 | 自旋锁 |读写锁

2026-11-04 12:29:26 来源:互联网转载

  • 初识生产者消费者模型
  • 同步
    • 条件变量
    • 初步使用
    • POSIX信号量
    • 其他常见的各种锁
      • 自旋锁
      • 读写锁

        初识生产者消费者模型

        ��一个例子:

        学生去超市消费的时候,与厂家生产的时候,两者互不相冲突。

        生产的过程与消费的过程 – 解耦

        临时的保存产品的场所(超时) – 缓冲区

        模型总结“321”原则:

        • 3种关系:生产者和生产者(互斥),消费者和消费者(互斥),生产者和消费者(互斥[保证共享资源的安全性] && 同步) – 产品(数据)
        • 2种角色:生产者线程,消费者线程
        • 1个交易场所:一段特定结构的缓冲区

          只要我们想写生产消费模型,我们本质工作其实就是维护321原则!

          特点:

          1. 生产线程和消费线程进行解耦
          2. 支持生产和消费的一段时间的忙闲不均的问题
          3. 提高效率

          举例:

          我们以前:main函数获取用户输入,然后调用fun函数,fun函数执行,打印结果。这是一个串行的流程,现在我们对应生产者消费者模型:


          同步

          条件变量

          由于上述的原因,我们不能仅靠锁来去实现线程互斥。

          什么是条件变量:

          • 当一个线程互斥地访问某个变量时,它可能发现在其它线程改变状态之前,它什么也做不了。(比如我们抢票,如果目前还没有票,那么每个人都是做同样的动作:加锁→判断票是否为0→解锁,在还没有放票之前,每个人都什么也做不了)
          • 例如一个线程访问队列时,发现队列为空,它只能等待,只到其它线程将一个节点添加到队列中。这种情况就需要用到条件变量。

            感性认识条件变量:

            模拟一个面试流程:

            1.假如我们一堆人都要到一家公司面试,但是这个公司的HR组织的不行,每次面试都是一堆人举手来竞争面试机会,都说要自己先来,而HR也是看谁顺眼就让他进去面试 – 一份共享资源被多线程并发式的竞争

            2.同样是面试,而HR组织的好,说要面试必须要到等待区等待,按照排队顺序来:(这个等待区就是一个条件变量)

            当条件不满足的时候,我们线程必须去某些定义好的条件变量上进行等待!

            初步使用

            #include #include #include #include int tickets = 1000;pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;pthread_cond_t cond = PTHREAD_COND_INITIALIZER;void *start_routine(void *args){    std::string name = static_cast(args);    while (true)    {        pthread_mutex_lock(&mutex);        pthread_cond_wait(&cond, &mutex); // 为什么要有mutex,后面就说        // 判断暂时省略        std::cout     // 通过条件变量控制线程的执行    pthread_t t[5];    for (int i = 0; i 

上一篇:服务器维修怎么修?

下一篇:MacOS - M1芯片 Mac 在“恢复”模式中启用系统扩展教程