Linux条件变量

news2024/9/23 19:27:18

一、条件变量函数

1,条件变量

条件变量:用来描述某种临界资源是否就绪的一种数据化描述。通常要配合mutex一起使用。

2,初始化

pthread_connd_init:

同样有一个静态的和一个动态的。 

其中cond是需要初始化的条件变量,attr传nullptr。

3,销毁

pthread_cond_destroy;

 cond:要销毁的条件变量。


4,等待

有俩个,一般只用第二个pthread_cond_wait:

在指定条件变量下等待。

      这里需要传一个锁,这个起始很好理解,因为你等待一定是带着锁的,因为你首先抢到了锁了,准备执行你的任务,发现条件不满足,这时候你需要在自己的条件变量上等待,但是这个时候你自己是带着锁的,也就是说你在等待的时候别人不会再申请到锁了,所以你在等待的时候这个函数会自动释放你获得的锁,再你被唤醒时再去竞争锁。

        条件等待是线程间同步的一种手段,如果只有一个线程,条件不满足,一直等下去都不会满足,所以必须要有一个线程通过某些操作,改变共享变量,使原先不满足的条件变得满足,并且友好的通知等待在条件变量上的线程。
        条件不会无缘无故的突然变得满足了,必然会牵扯到共享数据的变化。所以一定要用互斥锁来保护。没有互斥锁就无法安全的获取和修改共享数据

5,唤醒

第一个是唤醒指定条件变量上面等待的一个进程, 

第二个是唤醒指定条件变量上面等待的所有进程,

6,代码练习

#include <iostream>
#include <vector>
#include <functional>
#include <unistd.h>
#include <pthread.h>

using namespace std;

//创建一把静态的锁。
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
//创建一个条件变量
pthread_cond_t cond;

//相等于定义一个函数指针数组。
vector<function<void *()>> functors;
void *handler1()
{
    cout << "handler1" << endl;
}
void *handler2()
{
    cout << "handler2" << endl;
}

volatile bool quit = false;

void *waitcommend(void *args)
{
    //线程分离。不需要等待了。
    pthread_detach(pthread_self());
    while (!quit)
    {
        //
        pthread_mutex_lock(&mutex);
        //不满足条件再这个条件变量上等待。
        pthread_cond_wait(&cond, &mutex);
        //被唤醒之后执行任务。
        pthread_mutex_unlock(&mutex);

        for (auto &e : functors)
        {
            e();
        }
    }
    cout << "thread " << pthread_self() << "退出了" << endl;
    return nullptr;
}
int main()
{
    functors.push_back(handler1);
    functors.push_back(handler2);
    functors.push_back([]() -> void *
                       { cout << "我是landan" << endl; });
    //初始化条件变量
    pthread_cond_init(&cond, nullptr);
    pthread_t t1;
    pthread_t t2;
    pthread_t t3;
    pthread_create(&t1, nullptr, waitcommend, nullptr);
    pthread_create(&t2, nullptr, waitcommend, nullptr);
    pthread_create(&t3, nullptr, waitcommend, nullptr);

sleep(3);
cout<<"设置退出标记位,唤醒全部线程"<<endl;
    quit = true;//设置退出标记、
  pthread_cond_broadcast(&cond);

while(true)
{
    sleep(1);
    cout<<"main runing "<<endl;
}

//销毁条件变量
    pthread_cond_destroy(&cond);
    while (true)
    {
        sleep(1);
        cout << "我是main" << endl;
    }
    return 0;
}

       开始条件不满足,全部再cond条件变量上面等待,然后设计标记位quit位true模拟条件满足,唤醒所有线程,执行代码后条件木满足不在等待线程不在等待,直接执行后续代码退出。

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

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

相关文章

在线书法培训迎来新风口

随着社会教育水平的不断提高&#xff0c;书法不再是独属于某个年龄层的爱好&#xff0c;开始被越来越多人欣赏和重视。 写一手好字&#xff0c;对每一个人来说都是一个加分“外挂”。在考场上&#xff0c;一手好字无疑可以让阅卷老师在心中自然加分&#xff1b;在职场中&#…

源码深度解析之 Spring IOC

1. 基础知识 1.1 什么是 Spring IOC &#xff1f; IOC 不是一种技术&#xff0c;只是一种思想&#xff0c;一个重要的面向对象编程的法则&#xff0c;它能指导我们如何设计出松耦合、更优良的程序。 传统应用程序都是由我们在类内部主动创建依赖对象&#xff0c;从而导致类与…

Vue--》自定义指令的使用讲解

目录 自定义指令 自定义指令的分类 私有自定义指令&#xff1a; 全局自定义指令&#xff1a; 总结 自定义指令 vue官方提供了v-text、v-for、v-model、v-if等常用的指令&#xff0c;还允许开发者自定义指令。 自定义指令的分类 私有自定义指令&#xff1a; 在每个vue组…

[附源码]计算机毕业设计框架的食品安全监督平台的设计与实现Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

u-BOOT启动流程

1、u-boot入口&#xff1a;入口即第一行程序&#xff0c;程序的链接是由链接脚本决定的&#xff0c;编译uboot之后&#xff0c;可以在根目录下生成u-boot.lds文件 打开lds文件可以看到代码当前入口点&#xff1a; &#xff1a;_start&#xff0c;_start后面就是中断向量表&…

[附源码]Python计算机毕业设计Django演唱会门票售卖系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

股票接口怎样获取数据方便?

目前很多交易者对股票数据行情查询相关使用的系统也是很普遍&#xff0c;就比如说你查询A股的大秦铁路可以使用实时股票数据接口来获取它的实时股价&#xff0c;成交量&#xff0c;成交金额等情况。那么在这个过程中&#xff0c;股票接口是如何获取数据更方便呢&#xff1f;小编…

化工厂人员定位系统:聚焦化工安全问题,提升智慧管理水平

化工厂人员定位系统&#xff0c;以人员定位技术为核心&#xff0c;整合访客管理、出入口控制、地图、人脸识别、视频监控数据采集等各种管控技术&#xff0c;提供精准实时定位、轨迹查询、货物跟踪等功能&#xff0c;又称“智能化二道门人员管理系统”。 12月1日&#xff0c;鞍…

[附源码]计算机毕业设计剧本杀交流分享平台Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Spring进阶(二十一)之循环Bean详解

目录 什么是循环依赖 检测是否存在循环依赖 Spring底层是如何解决循环依赖的问题 循环依赖无法解决的情况 为什么需要用3级缓存 问题 原因 案例 单例bean解决了循环依赖&#xff0c;还存在什么问题 什么是循环依赖 这个很好理解&#xff0c;多个bean之间相互依赖&#…

Python制作进度条,原来有这么多方法

如果你之前没用过进度条&#xff0c;八成是觉得它会增加不必要的复杂性或者很难维护&#xff0c;其实不然。要加一个进度条其实只需要几行代码。 在这几行代码中&#xff0c;我们可以看看如何在命令行脚本以及 PySimpleGUI UI 中添加进度条。 下文将介绍 4 个常用的 Python 进度…

TL431介绍及其应用电路

TL431介绍及其应用电路 硬件攻城狮 1. TL431简介 TL431是常用的三端并联稳压器&#xff0c;具有较好的热稳定性&#xff0c;输出电压可以设置为Vref~36V之间的任何值。被广泛用作基准源、比较器、运放等功能。在隔离电源中&#xff0c;TL431经常与光耦配合构成隔离反馈回路&…

PDF文件怎么合并?看完这篇就懂了!

不知道小伙伴们有没有这样的经历&#xff0c;那就是准备好一些pdf去打印店打印的时候&#xff0c;本来想要打印双面的&#xff0c;但是店家却表示pdf太小&#xff0c;只能一页一页的单页打印。这就给我们的钱包无形之中增加了很多的负担&#xff0c;因为有时候我们没必要打印单…

搜索与图论-有向图的拓扑序列

文章目录一、有向图的拓扑序列1. 拓扑序列2. 拓扑排序3. 如何进行拓扑排序4. 拓扑排序具体实现详见例题有向图的拓扑序列二、有向图的拓扑序列例题——有向图的拓扑序列具体实现1. 样例演示2. 实现思路3. 代码注解4. 实现代码一、有向图的拓扑序列 有向图的拓扑序列就是图的广…

遥感测深方法综述(二)CZMIL 机载LiDAR 测深系统

机载激光雷达测深测量是集激光测距、GNSS定位/姿态测量、航空摄影等多种技术于一体的新型主动机载激光测绘&#xff0c;可应用于海滩和海岸线、浅海编图、海岛、岛礁、水下障碍物的调查&#xff0c;是高效获取高精度近岸海底地形的重要技术&#xff0c;尤其对“人下不去、船上不…

31_ADC基本原理及单次采集实验

目录 ADC简介 STM32F10x ADC特点 ADC执行模式 相关寄存器及数据对齐方式 ADC的采样时间 常用库函数 单次转换一般步骤 实验源码 ADC简介 Analog-to-Digital Converter的缩写。指模/数转换器或者模拟/数字转换器。是指将连续变量的模拟信号转换为离散的数字信号的器件。…

Hylicos --- krprint实现

可变参函数的工作原理 函数调用时先用寄存器R0 ~R3 存放参数&#xff0c;如果不够放还要使用到堆栈&#xff0c;参数列表的形参从右到左依次入栈&#xff0c;弹栈时就是从左到右的顺序。 如果函数参数的个数固定&#xff0c;编译器就可以很清楚地在函数运行时依次从堆栈中弹出…

关于城市旅游的HTML网页设计 HTML+CSS上海博物馆网站 dreamweaver作业静态HTML网页设计 html网页制作期末大作业

&#x1f468;‍&#x1f393;静态网站的编写主要是用 HTML DⅣV CSSJS等来完成页面的排版设计&#x1f469;‍&#x1f393;&#xff0c;一般的网页作业需要融入以下知识点&#xff1a;div布局、浮动定位、高级css、表格、表单及验证、js轮播图、音频视频Fash的应用、uli、下拉…

JVM--这一篇就够了

1、JVM内存模型 Java内存模型是指Java虚拟机的内存模型&#xff0c;我们来看下Java内存模型的图片: 其中&#xff0c;在JAVA的JVM调优中&#xff0c;我们JAVA程序员需要重点关注的&#xff0c;首先是堆&#xff0c;我们看下堆内存的内存模型: 2、类的加载过程 (1)、加载 …

基于jsp+ssm的高速公路收费管理系统-计算机毕业设计

项目介绍 现阶段&#xff0c;政府都会对高速公路收费进行管理&#xff0c;用户通过进入相关系统对高速公路收费状况进行了解&#xff0c;简化了高速公路收费管理流程&#xff0c;进而提高政府高速收费管理效率&#xff0c;达到更好的管理目的。 本设计利用JSP作为开发语言。后…