linux操作系统之条件变量

(1)条件变量

               条件变量本身不是锁,但它可以造成线程阻塞,通常与互斥锁配合使用。

(2)条件锁相关函数

              pthread_cond_t类型,用于定义条件变量

         1)初始化一个条件变量:pthread_cond_init

                 int pthread_cond_init(pthread_cond_t *restrict cond,const pthread_condattr_t *restrict attr);

               参数2:条件变量的属性,传NULL即可,为默认值

               可采用静态初始化:pthread _cond_t cond=PTHREAD_COND_INITIALIZER;

         2)销毁一个条件变量:pthread_cond_destroy

                int pthread_cond_destroy(pthread_cond_t *cond);

         3)阻塞等待条件变量:pthread_cond_wait(配合互斥锁使用)

                int pthread_cond_wait(pthread_cond_t *restrict cond,pthread_mutex_t *restrict mutex);

                函数作用: 

                           1>阻塞等待条件变量cond满足。

                           2>释放已掌握的互斥锁(解锁互斥量)相当于pthread_mutex_unlock(&mutex); 

                                           第1,2步为一个原子操作

                          3>当被唤醒,pthread_cond_wait函数返回,解除阻塞并重新获得互斥锁pthread_mutex_lock(&mutex)

         4)限时等待一个条件变量(以绝对时间等待):pthread_cond_timewait

                int pthread_cond_timewait(pthread_cond_t *restrict cond,pthread_mutex_t *restrict mutex,condt struct timespec*restrcit abstime);

             struct timespec{

                          time_t tv_sec;//秒

                         long    tv_nsec;//纳秒

              };

 abstime;绝对时间,通过time(NULL)函数获取;

          5)唤醒至少一个阻塞在条件变量上的线程:pthread_cond_signal

               int pthread_cond_signal(pthread_cond_t *cond);

        6)唤醒全部阻塞在条件变量上的线程:pthread_cond_broadcast(pthread_cond_t  *cond);

(3)线程同步之生产者消费者变量模型

          假定有两个线程,一个模拟生产者行为,一个模拟消费者行为。两个线程同时操作一个共享资源(汇聚),生产者生产产品,消费者消费产品。

        

       

                

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/382313.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux操作系统之信号量、互斥量在进程间的同步、文件锁

(1)信号量:进化版的互斥量 多个线程间对某个对象的部分数据进行共享,使用互斥锁是没有办法实现的,只能将整个数据对象锁住。这样虽然达到了多线程操作数据共享的目的,却导致线程并发性下降。 信号量&#x…

linux网络编程之网络应用设计模式、分层模型、通信过程

(1)网络协议 可以理解为规则,其中包含着数据传输和数据的解释。 典型的协议:传输层:tcp/udp协议,应用层:http/ftp协议,网络层:ip协议,网路接口:ar…

linux网络编程之通信协议格式

好文参考:《网路传输的三张表:MAC地址表,ARP缓存表和路由表》http://www.cnblogs.com/clovn/p/4911212.html (1)数据包封装 传输层及其一下的机制由内核决定,主要负责通讯的具体细节;应用层由用…

linux网络编程之Socket编程

(1)socket套接字 1)在linux环境下,socket用于表示进程间网络通信的特殊文件类型,其本质是内核借助缓冲区形成的伪文件(不占磁盘空间,除此之外还有二进制文件,管道,字符文…

Linux操作系统之简易实现server/client

1.首先将出错处理封装成函数,具体封装思想:是在底层函数的基础上将首字母大写(方便在编程中查找函数文件的manpage,而不需要使用命令,直接用shiftk),然后调用底层库函数并考虑出错处理,具体函数如下&#x…

linux网络编程之TCP三次握手和四次挥手

1.在TCP连接的过程中,有三个阶段,分别是建立连接,传递数据和断开连接,通讯时序图如下所示: 2.结合TCP数据报格式分析建立连接的三次握手 1)首先客户端发送一个带有SYN标志的TCP报文给服务器端,询问服务器端…

linux网路编程之多进程并发服务器

1)使用多进程并发服务器考虑的因素: (1)父进程描述最大文件描述符的个数(父进程需要关闭accept返回的新文件描述符) (2)系统内可创建进程的个数(与内存大小相关&#xff…

linux网路编程之多线程并发服务器

1)在使用进程模型开发服务器过程中考虑以下问题 (1)调整进程内最大文件描述符上限 (2)线程如有共享,考虑线程同步 (3)客户端线程退出时,做退出处理(线程分离&…

linux网路编程之TCP状态转换及端口复用

(1)TCP状态转换图 其中图中分为三种状态:实线代表的主动发起连接,虚线代表的被动发起连接,细实线代表的可以双向发起连接的状态。 主动发起连接方状态变化:1)主动发起连接的一方发送SYN标志位&…

linux网络编程之多路I/o转接服务器select

(1)多路IO转接服务器也叫做多任务IO服务器,其主要思想是不再由程序自己监听客户端连接,取而代之的是由内核替应用程序监视文件,具体实现模型如图所示: 当客户端请求和服务器连接时,内核接收到连接指令,告诉…

linux网络编程之多路I/O转接服务器poll函数

&#xff08;1&#xff09;poll函数 头文件&#xff1a;#include<poll.h> int poll(struct pollfd*fds, nfds_t nfds,int timeout); struct pollffd{ int fd;//文件描述符 short events;//监控的事件 short revents;//监控事件中满足条件返回的事情 }&#xff1…

《C++ Primer 第五版》第二章(1-4小节)------基本内置类型,初始化和赋值及声明和定义,指针和引用,const和constexpr

C Primer第二章的内容主要介绍了变量和基础类型&#xff0c;包括C语言定义的基础内置类型、变量的定义及声明、符合类型如指针及引用的介绍和const及常量表达式constexpr的介绍&#xff0c;本次博客也从这四个方面进行系统的介绍&#xff0c;如果有不足之处&#xff0c;还望其他…

793. 阶乘函数后K个零 golang

Me(AC 33 / 44 个通过测试用例) func preimageSizeFZF(K int) int {count : 0for i : 0; i < 1000000; i {if trailingZeroes(i) K {count}}fmt.Println(count)//fmt.Println(trailingZeroes(25))return count}func trailingZeroes(n int) int {if n 0 {return 0}return …

小程序radio单选框回显

话不多说&#xff0c;效果图如下&#xff1a; 具体代码如下&#xff1a; <radio-group name"radio" bindchange"getSex"><label><radio value"1" checked"{{xingbie1}}" />男</label><label><radio…

《C++ Primer 第五版》(第4.11节类型转换) ————关于无符号数和有符号数的运算探究

1.关于无符号数和有符号数的运算 关于无符号数和有符号数的运算&#xff0c;在我看来一直是觉得只要有无符号数和有符号数的运算&#xff0c;有符号数就转化为无符号数&#xff0c;但是在《C Primer 第五版》的p142介绍&#xff0c;关于无符号数和有符号数的运算如下规定的&…

543. 二叉树的直径 golang

文章目录543. 二叉树的直径example正确解法question代码&#xff08;wrong)543. 二叉树的直径 概要: 借鉴了这个题的代码。可是有一个测试用例过不去 https://blog.csdn.net/csdn_kou/article/details/104122067 example 给定一棵二叉树&#xff0c;你需要计算它的直径长度。一…

《C++ Primer 第五版》(第4.11-4.12节)——static_cast,const_cast和reinterpret_cast类型转换, 运算符优先级表

1.static_cast,const_cast和reinterpret_cast类型转换 static_cast:强制的类型转换(不能用于底层的const转换),以前C语言中的强制类型转换都可以使用static_cast来完成。如&#xff1a;int i3; double jstatic_cast<double>(i); const_cast&#xff1a;改变底层const(指针…

《C++ Primer 第五版》(第5.1-5.6节) ——异常处理机制(try语句块,throw表达式和catch异常捕捉处理单元)

1. 异常处理机制 C中使用try,throw和catch三个关键字来实现异常的触发、抛出和处理的功能&#xff0c;具体通用语法形式如下&#xff1a; try{ if(true) normal program-statements&#xff1b;//没有触发异常时候执行的代码 if(false) throw(exception); //出现错误&am…

283. 移动零golang

Me 遍历所有数组&#xff0c;统计0的个数倒着把零写入数组末尾 func moveZeroes(nums []int) {var count, j intfor _, key : range nums {if key 0 {count} else{nums[j] keyj}}for i:len(nums) - count; i < len(nums); i {nums[i] 0} }最优解(快慢指针) 减少了数组…

QT自定义MainWindow

1.开发环境&#xff1a;Qt 4.7.3 MinGW 32bit (MSVC2015 32bit) 2.实现大纲&#xff1a; 1&#xff09;自定义边框&#xff0c;标题栏&#xff0c;工具栏&#xff0c;内容栏&#xff0c;状态栏&#xff08;后面三个代码中没有实现实现&#xff09; 2&#xff09;重写鼠标事件…