linux条件变量使用和与信号量的区别

今天在学习进程同步机制的时候看见一句话:

条件变量只能在管程中通过两个原语操作——wait原语和signal原语

于是发出了一个疑问:信号量机制和条件变量同步机制的区别在哪里?

一.简单介绍

1.条件变量同步机制

  • 让进入管程却因资源不足而阻塞的进程暂时放弃管程控制权(开放管程),进入该条件变量的等待队列条件变量只能在管程中通过两个原语操作——wait原语和signal原语。
  • 一个进程已进入管程但无法继续执行,便在相应的条件变量x上调用x.wait( ),将自己阻塞并移入x的等待队列中,放弃管程控制权(开放管程),另一进程可以通过对同一个条件变量执行x.signal( )来唤醒之前在x上等待的进程
  • 条件变量仅起到维护等待队列的作用,不存在相关的值,也不能象信号量那样加减累计。

2.互斥锁

在编程中,引入了对象互斥锁的概念,来保证共享数据操作的完整性。每个对象都对应于一个可称为" 互斥锁" 的标记,这个标记用来保证在任一时刻,只能有一个线程访问该对象。
在Posix Thread中定义有一套专门用于线程同步的mutex()函数。

下面内容参考:https://www.shuzhiduo.com/A/n2d9WBDvJD/

二.条件变量的使用:(来自APUE,即UNIX环境高级编程)

#include <pthread.h>struct msg {struct msg *m_next;/* ... more stuff here ... */
};
struct msg *workq;
pthread_cond_t qready = PTHREAD_COND_INITIALIZER;
pthread_mutex_t qlock = PTHREAD_MUTEX_INITIALIZER;void process_msg(void)
{struct msg *mp;for (;;) {pthread_mutex_lock(&qlock);while (workq == NULL)pthread_cond_wait(&qready, &qlock);mp = workq;workq = mp->m_next;pthread_mutex_unlock(&qlock);/* now process the message mp */}
}void enqueue_msg(struct msg *mp)
{pthread_mutex_lock(&qlock);mp->m_next = workq;workq = mp;pthread_mutex_unlock(&qlock);pthread_cond_signal(&qready);
}

三.条件变量和信号量的区别:

(1)最大的区别应该是使用条件变量可以一次唤醒所有等待者,但信号量不行。

(2)信号量有一个表示状态的值,而条件变量是没有的,没有地方记录唤醒(发送信号)过多少次,也没有地方记录唤醒线程(wait返回)过多少次。从实现上来说一个信号量可以是用mutex + counter + condition variable实现的。因为信号量有一个状态,如果想精准的同步,那么信号量可能会有特殊的地方。信号量可以解决条件变量中存在的唤醒丢失问题。

(3)在Posix.1基本原理一文声称,有了互斥锁和条件变量还提供信号量的原因是:“本标准提供信号量的主要目的是提供一种进程间同步的方式,这些进程可能共享也可能不共享内存区。互斥锁条件变量是作为线程间的同步机制说明的,这些线程总是共享(某个)内存区。”尽管信号量的意图在于进程间同步,互斥锁条件变量的意图在于线程间同步,但是信号量也可用于线程间,互斥锁和条件变量也可用于进程间。信号量最有用的场景是用以指明可用资源的数量。

经典的一句话:
互斥量是信号量的一种特例,互斥量的本质是一把锁。A mutex is basically a lock that we set (lock) before accessing a shared resource and release (unlock) when we’re done

linux条件变量使用和与信号量的区别相关推荐

  1. Linux 条件变量详解

    LINUX条件变量详解 一.条件变量概述 1.1 函数API讲解 二.函数使用 三.结果展示与分析 一.条件变量概述   条件变量不是一个把锁,它实质上一个类似信号的东西,与锁相互配合使用,因为锁所能 ...

  2. Linux先发送条件变量,浅谈Linux条件变量的使用

    Linux线程同步之间存在多种机制,条件变量是一种类似操作系统里提到的生产者-消费者算法的同步机制,允许线程以无竞争的方式等待特定条件的发生. 示例伪代码: void* Thread1(void){ ...

  3. Linux先发送条件变量,linux 条件变量 浅谈Linux条件变量的使用

    想了解浅谈Linux条件变量的使用的相关内容吗,在本文为您仔细讲解linux 条件变量的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:linux,条件变量,下面大家一起来学习吧. Linu ...

  4. 理解 Linux 条件变量

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/cheungmine/article/details/37317429 理解 Linux 条件变量 1 ...

  5. 深入理解Linux 条件变量2:使用条件变量实现[生产-消费]框架

    前言 在上一篇文章<深入理解Linux 条件变量1:使用场景.接口说明>我们简单介绍了条件变量的使用场景以及相关接口,正如大神linus所说:talk is cheap,show me t ...

  6. 深入理解Linux 条件变量3:条件变量为什么要配合着锁使用?

    在上一篇文章<深入理解Linux 条件变量2:使用条件变量实现[生产-消费]框架>中,我们通过示例代码演示了条件变量的使用.从条件变量的API接口中我们很容易发现,条件变量必须配合着互斥锁 ...

  7. linux条件变量唤醒丢失,多线程编程精髓(三)

    本篇主要讲Linux环境下的多线程同步内核对象. (1)linux线程同步之互斥体:linux互斥体的用法与windows的临界区对象类似,使用数据结构 pthread_mutex_t表示互斥体对象( ...

  8. Linux 条件变量使用细节(为何调用 pthread_cond_wait 前加锁,函数内部解锁,返回时又加锁)

    一.本文目的 首先说明,本文重点不在怎么用条件变量.这里我先列出 apue 中对于pthread_cond_wait函数的这么一段话: 调用者把锁住的互斥量传给函数,函数然后自动把调用线程放到等待条件 ...

  9. Linux 条件变量 pthread_cond_wait

    条件变量是利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:一个线程等待"条件变量的条件成立"而挂起:另一个线程使"条件成立"(给出条件成立信号). ...

最新文章

  1. 禁止用户复制网页的内容
  2. 在dreamweaver mx中它只能对html文件可以进行编辑,【职称计算机考试网页制作历年试题及答案二】- 环球网校...
  3. 设计模式:代理模式是什么,Spring AOP还和它有关系?
  4. 为什么要选择Apache Pulsar(二)
  5. Docker Compose 简介、安装、初步体验
  6. Spring-tx-PlatformTransactionManager(DataSourceTransactionManager)
  7. atitit.php 流行框架 前三甲为:Laravel、Phalcon、Symfony2 attilax 总结
  8. 信息网络传播中的服务器标准,信息网络传播权的服务器标准与实质替代标准之争...
  9. excel宏教程_综合 | 如何使用Excel按条件高效查找数据?
  10. 物联网设计之智慧幼儿园(一)
  11. mysql导入错误1148_解决ubuntu server mysql load data infile 导入本地文件ERROR 1148 (42000)错误。...
  12. 一文了解linux 网络协议栈(链路层)
  13. java cda安装_JAVA如何与R完美结合起来
  14. ae合成设置快捷键_你知道吗?其实修改AE模板并不困难,只是你没有看到我写的这篇文章而已!...
  15. MobSF移动安全检测框架简述
  16. 蚂蚁感冒问题暴力解决
  17. Spring rebooted --重新认识Spring
  18. SPSS通过相同的ID(或字段)合并两个文件
  19. 易语言入门教程之屏幕输出程序
  20. Win10补丁KB4560960导致打印机无法打印

热门文章

  1. 笔记本电脑硬盘不见了_机械革命笔记本电脑文件不见了解决方案
  2. MVC web项目中引入jquery插件
  3. 申请免费的国产泛域名证书
  4. 稀有资源,送你极致3D听觉体验
  5. Kafka、zookeeper集群一键启动、一键关闭
  6. 设计模式-09-装饰器模式
  7. jQuery箭头切换图片 - 学习笔记
  8. 栋的周评 | 第一回合(定期更新、博客动态、亚马逊 AWS 云技术、其他技术、收听、哲学、书籍、影视、新奇、好歌推荐)
  9. 2020最新Java集合面试题
  10. 张小庆,在路上-开始(5)到肥牛城吃羊蝎子