pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t*mutex)函数

传入的參数mutex用于保护条件,由于我们在调用pthread_cond_wait时,假设条件不成立我们就进入堵塞。可是进入阻塞这个期间,假设条件变量改变了的话,那我们就漏掉了这个条件。由于这个线程还没有放到等待队列上。所以调用pthread_cond_wait前要先锁相互排斥量,

即调用pthread_mutex_lock(),pthread_cond_wait在把线程放进堵塞队列后,自己主动对mutex进行解锁,使得

其他线程能够获得加锁的权利。这样其他线程才干对临界资源进行訪问并在适当的时候唤醒这个堵塞的进程。

当pthread_cond_wait返回的时候又自己主动给mutex加锁。

实际上边代码的加解锁步骤例如以下:
/************pthread_cond_wait()的用法**********/
pthread_mutex_lock(&qlock);    /*lock*/
pthread_cond_wait(&qready, &qlock); /*block-->unlock-->wait() return-->lock*/
pthread_mutex_unlock(&qlock); /*unlock*/

/*****************************************************/

了解 pthread_cond_wait() 的作用很重要 -- 它是 POSIX 线程信号发送系统的核心,也是最难以理解的部分。

首先,让我们考虑下面情况:线程为查看已链接列表而锁定了相互排斥对象,然而该列表恰巧是空的。这一特定线程什么也干不了 -- 其设计意图是从列表中除去节点,可是如今却没有节点。因此,它仅仅能:

锁定相互排斥对象时。线程将调用 pthread_cond_wait(&mycond,&mymutex)。

pthread_cond_wait() 调用相当复杂,因此我们每次仅仅运行它的一个操作。

pthread_cond_wait() 所做的第一件事就是同一时候对相互排斥对象解锁(于是其他线程能够改动已链接列表),并等待条件 signal 发生,当 pthread_cond_wait() 接收到还有一个线程的“信号”时,它将苏醒(此时还要等其他线程mutex解锁),苏醒前会先对mutex加锁。

转载于:https://www.cnblogs.com/clnchanpin/p/6877117.html

linuxc线程信号-pthread_cond_wait理解相关推荐

  1. IPC——线程信号问题

    所有的线程共享相同的信号处理方式 主线程将SIGINT信号的处理方式设置为了捕获,那么所有的次线程共享这一处理方式,如果其中某个次线程改变了该信号的处理方式,那么所有的线程将共享这一改变. 回顾&qu ...

  2. php和python的多线程,Python多线程以及线程锁简单理解(代码)

    本篇文章给大家带来的内容是关于Python多线程以及线程锁简单理解(代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 多线程threading 模块创建线程创建自己的线程类线程通 ...

  3. 进程和线程的深入理解

    下面是抽象类比: 1.单CPU:一台单核处理器计算机 = 一个车间: 2.多CPU:一台多核处理器计算机 = 一座工厂: 1.进程:一个车间 = 一个进程:(即一个运行的程序) 2.多进程:一座工厂可 ...

  4. C11头文件threads.h声明了创建和管理线程,信号,条件变量的函数

    作者Danny Kalev 是通过以色列系统分析师协会认证的系统分析师, 并且是专攻C++的软件工程师. Kalev 写了多本C++的书籍,同时给不同的软件开发者站点投搞C++文章. 他是C++标准委 ...

  5. Java并发编程与技术内幕:线程池深入理解

    林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 摘要: 本文主要讲了Java当中的线程池的使用方法.注意事项及其实现源码实现原理,并辅以实例加 ...

  6. 平稳与非平稳随机信号的理解

    最近在做stft的相关算法,发现stft的前提条件是在窗函数内信号必须被认为是平稳随机信号,随机信号的平稳和非平稳有什么区别么?总结如下: 1.首先理解随机信号概念,随机信号理论上讲是不能利用公式复现 ...

  7. 进程和线程最生动的理解

    进程 (process)和 线程 (thread)是操作系统的基本概念,但是它们比较抽象,不容易掌握.我发现有一个很好的类比,可以把它们解释地清晰易懂. 计算机的核心是CPU,它承担了所有的计算任务. ...

  8. 对图像高频信号和低频信号的理解

    今天开始讲图像了,讲了很多在频域处理的方法,回来复习一下图像的频域. 一 .关于图像高频和低频 1.1 对图像高频信号和低频信号的理解 图像中的低频信号和高频信号也叫做低频分量和高频分量. 简单一点说 ...

  9. 15.线程信号(Signaling)

    线程信号的目的是使得线程彼此之间可以互相发送信号.另外,线程信号可以使得线程去等待来自其他线程的信号.例如,一个线程B可能等待来自一个线程A的信号,说明数据准备处理了. 经由共享变量的信号 对于线程互 ...

最新文章

  1. 安全预测 影响企业风险管理的三大趋势
  2. 变量值为NAN的什么意思
  3. 关于引用传递的测试题
  4. opencv 眼睛识别 linux,用opencv测试人脸识别眨眼练习及问题
  5. rxjs interval和take的混合使用
  6. python硬件交互_Python操作系统库说明,pythonos,笔记
  7. Arch Linux 安装总结
  8. fread rb与r,wb,w的区别
  9. 米斯特白帽培训讲义(v2)实战篇 迅雷 CMS
  10. pnpm 是更快的包管理工具
  11. 【路径规划】基于matlab改进的蚁群算法机器人栅格地图避障路径规划【含Matlab源码 905期】
  12. Win10 powershell字体设置
  13. 汉王考勤管理系统使用教程
  14. 【青梅快讯】迅速迭代,Greenplum6为你带来持续惊喜
  15. java读取局域网种大华摄像机信息
  16. 2021五一数学建模ABC思路
  17. 在线抽奖、限时秒杀、拼团抢购,别的商城有的功能你也可以轻松拥有!
  18. 求分子分母最大公约数c语言,怎么求两个分数的最大公约数?
  19. html代码的魔方加密,浅析三维魔方加密算法
  20. esxi5 的tart命令使用注意点

热门文章

  1. (转载)mysql 用drop和delete方法删除用户的区别
  2. Java中当前的时间的各种写法
  3. case when then else end
  4. Eclipse中导入Java项目出现“No projects are found to import”
  5. Mysql介绍与安装LinuxmacOS系统
  6. 计算机路表配置命令,计算机、华为交换机、路由器配置命令表
  7. kali linux改中文_【亲测实验】kali linux 2020 设置为中文方法
  8. 来电语音播报软件下载apk_消息语音播报app下载-消息语音播报安卓版 v1.0.1 - 安下载...
  9. oracle中的and用法,Oracle bitand( )函数简介
  10. ntlm java_深讨Java SE 6 在 HTTP 方面的新特性(NTLM)