调用另一个cpp的变量_再谈条件变量—从入门到出家

再谈条件变量—从入门到出家


C语言--条件变量

条件变量是在线程中以睡眠的方式等待某一条件的发生;

条件变量是利用线程间共享的全局变量进行同步的一种机制:

  • 一个线程等待"条件变量的条件成立"挂起
  • 另一个线程使"条件成立"

条件变量的使用总是和一个互斥锁结合在一起;

**作用:**使用条件变量可以以原子方式阻塞线程,直到某个特定条件为真为止


我们一般使用的函数是:

#include <semaphore.h>
int pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t *cond_attr) ;
int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex);
int pthread_cond_signal(pthread_cond_t *cond);
int pthread_cond_broadcast(pthread_cond_t *cond);
int pthread_cond_destroy(pthread_cond_t *cond);
案例一

代码:

#include <stdio.h>
#include <semaphore.h>
#include <pthread.h>pthread_t t1;
pthread_t t2;pthread_mutex_t mutex;
pthread_cond_t cond;int i=0;void* Process1(void* arg)
{while(1){pthread_mutex_lock(&mutex);i++;if(i%5 == 0){pthread_cond_signal(&cond);}else{printf("this is Process1n");}pthread_mutex_unlock(&mutex);sleep(2);}
}void* Process2(void* arg)
{while(1){pthread_mutex_lock(&mutex);pthread_cond_wait(&cond,&mutex);printf("this is Process2,i=%dn",i);pthread_mutex_unlock(&mutex);sleep(2);}
}int main()
{pthread_cond_init(&cond,NULL);pthread_mutex_init(&mutex,NULL);pthread_create(&t1,NULL,Process1,NULL);pthread_create(&t2,NULL,Process2,NULL);pthread_join(t1,NULL);pthread_join(t2,NULL);return 0;
}

结果:

root@iZuf67on1pthsuih96udyfZ:~/C++/C++_test/Progress/cond# ./test1 
this is Process1
this is Process1
this is Process1
this is Process1
this is Process2,i=5
this is Process1
this is Process1
this is Process1
this is Process1
this is Process2,i=10
this is Process1
this is Process1
^C

通过条件变量来控制线程的输出;


上述是在C语言中使用条件变量对线程进行一个控制,在C++中,在标准库中也提供了同样的机制,使用起来会比C语言的更加方便,但是原理还是一样的;

C++ 条件变量

C++标准库在< condition_variable >中

原则与C语言中类似

  • 包含< mutex >和< condition_variable >,声明一个mutex和一个condition_variable变量
  • 通知“条件已满足”的线程必须调用notify_one()或notify_all(),条件满足时唤醒处于等待中的一个条件变量;
  • 等待"条件被满足"的线程必须调用wait(),可以让线程在条件未被满足时陷入休眠状态,当接收到通知时被唤醒去处理相应的任务;
C++ 使用案例
#include <iostream>
#include <thread>
#include <condition_variable>
#include <mutex>
#include <unistd.h>using namespace std;//全局条件变量
condition_variable cond;
mutex _mutex;
int count = 0;void fun1()
{while(1){count++;unique_lock<mutex>lock(_mutex);if(count%5 == 0){cond.notify_one();}else{cout<<"this is fun1,count="<<count<<endl;}lock.unlock();sleep(1);}
}void fun2()
{while(1){unique_lock<mutex>lock(_mutex);cond.wait(lock);cout<<"this is fun2,count="<<count<<endl;lock.unlock();sleep(2);}
}int main()
{thread t1(fun1);thread t2(fun2);t1.join();t2.join();return 0;
}

结果:

root@iZuf67on1pthsuih96udyfZ:~/C++/C++_test/Progress/cond# g++ -std=c++11 test2.cpp -o test2 -lpthread
root@iZuf67on1pthsuih96udyfZ:~/C++/C++_test/Progress/cond# ./test2
this is fun1,count=1
this is fun1,count=2
this is fun1,count=3
this is fun1,count=4
this is fun2,count=5
this is fun1,count=6
this is fun1,count=7
this is fun1,count=8
^C

到这里,基本回顾了C和C++中条件变量的用法,但是在实际应用中。又有设么用呢?

可能工作年限多的人,接触到的比较多,但是对于很多小白来说,或者刚毕业、刚参加工作的人来说,这点接触的就不是很多了,。这里来举一个例子说一下:

假如在某个项目中,需要用到的是多个线程,最简单的就是,用队列的时候,我们一边写一边读,总是要加锁的,但是,我们的线程就必须一直空转对队列进行检测是否有数据,但是这样往往会造成CPU使用率比较高,资源的浪费,这种情况下,我们就可以是使用条件变量,控制线程的循环,降低资源使用率;当然,也有很多场景值得去探索,也有很多技术可以解决这这个问题,希望大家一起探索前进;

问题思考

上面介绍了C和C++中的使用,但是其实还是有些疑问的

疑问:为什么pthread_cond_wait前加了锁,但是pthread_cond_signal还可以加锁?

首先看下我从网上找的一张图:

786161db8180ec4de99eaae5c8f361fe.png

从这个图片中,我们发现了一个现象,pthread_cond_wait函数内存进行对锁的解锁,并且阻塞休眠操作,阻塞完成后,再次进行了加锁操作;也就是在pthread_cond_wait阻塞期间,pthread_cond_signal可以进行加锁和解锁操作,这里是不冲突的;

往期精彩文章汇总
  • muduo源码剖析学习总结
  • 掌握这个技能,你可以畅游github
  • C++ 简单对象池实现
  • 内存池设计与实现
  • 恭喜你!发现宝藏一份--技术文章汇总

想了解学习更多C++后台服务器方面的知识,请关注: 微信公众号:====CPP后台服务器开发====


冰冻三尺,非一日之寒,水滴石穿,非一日之功,愿我们一起加油努力~

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

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

相关文章

不同page页面选择不同页面模板的方法

仿制一个企业站的时候发现该站用了很多page页面&#xff0c;而且个别页面的样式不相同&#xff0c;同时区别于post文章页面&#xff0c;其实不同之处就在于每个页面的xhtmlcss的不同&#xff0c;关键是page模板选择的问题&#xff0c;恒宁总结了以下两种方法。 第一种&#xff…

jquer each 遍历的结果不显示 null_SpringBoot系列(三十一)- Thymeleaf如何用th:each 做条件遍历

步骤1:基于前面的知识点步骤2:先运行&#xff0c;看到效果&#xff0c;再学习步骤3:模仿和排错步骤4:TestController步骤5:普通遍历步骤6:带状态的遍历步骤7:结合 select步骤8:结合 单选框步骤9:完整的 test.html步骤10:重启测试步骤 1 : 基于前面的知识点本知识点是建立在上一…

python3.6sysos_求大佬,这是什么情况啊

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 Traceback (most recent call last): File "manager.py", line 13, in sys.exit(main()) File "manager.py", line 8, in main manager.run() File "/root/imooc/lib/python3.5/site-packages/flask_sc…

.Net学习笔记----2015-06-30(超市收银系统01-仓库类)

GUID&#xff1a; 产生一个不会重复的ID static void Main(string[] args){//产生一个不会重复的编号Console.WriteLine(Guid.NewGuid().ToString());Console.WriteLine(Guid.NewGuid().ToString());Console.WriteLine(Guid.NewGuid().ToString());Console.WriteLine(Guid.NewG…

Winform开发之ADO.NET对象Connection、Command、DataReader、DataAdapter、DataSet和DataTable简介...

ADO.NET技术主要包括Connection、Command、DataReader、DataAdapter、DataSet和DataTable等6个对象&#xff0c;下面对这6个对象进行简单的介绍&#xff1a;&#xff08;1&#xff09;Connection对象的主要功能是与数据库进行连接&#xff08;事物处理也使用此对象&#xff09;…

python电子英汉词典显示_python网页抓取之英汉字典

linux的字典本人实在用起来不舒服&#xff08;stardict挺不错的&#xff0c;但是界面好看些&#xff0c;功能简单易用就好了&#xff09; &#xff0c;在线翻译又得打开庞大的浏览器....就打算自己写个&#xff0c;但是时间有限&#xff0c;为了简单&#xff0c; 还是用python抓…

清空缓存的命令_超详细的mysql数据库查询缓存原理解析、涉及命令、流程分析等...

概述mysql查询缓存在数据库优化可以起到很大的作用&#xff0c;今天主要针对这一块做一个总结&#xff0c;下面一起来看看吧~一、缓存条件&#xff0c;原理MySQL Query Cache是用来缓存我们所执行的SELECT语句以及该语句的结果集&#xff0c;MySql在实现Query Cache的具体技术细…

和lua的效率对比测试_Unity游戏开发Lua更新运行时代码!

最近沉迷lua脚本热更&#xff0c;想说这个可以提高多少菜鸡的调试效率&#xff0c;找了网上好多文章&#xff0c;但是都不行&#xff0c;尝试了很久&#xff0c;并且自己测试和学习&#xff0c;写了一遍&#xff0c;勉强能热更了。下面记录一下热更Lua的过程。一、用来卸载表格…

nodejs cluster ip hash_redis集群架构了解一下?一致性hash了解吗?

在前几年&#xff0c;redis 如果要搞几个节点&#xff0c;每个节点存储一部分的数据&#xff0c;得借助一些中间件来实现&#xff0c;比如说有 codis&#xff0c;或者 twemproxy&#xff0c;都有。有一些 redis 中间件&#xff0c;你读写 redis 中间件&#xff0c;redis 中间件…

python 连接oracle_常用的Python库,给大家分享一下!

Tkinter———— Python默认的图形界面接口。Tkinter是一个和Tk接口的Python模块&#xff0c;Tkinter库提供了对Tk API的接口&#xff0c;它属于Tcl/Tk的GUI工具组。Tcl/Tk是由John Ousterhout发展的书写和图形设备。Tcl(工具命令语言)是个宏语言&#xff0c;用于简化shell下复…

python 前端学习_python学习之路7 前端学习3

1.页面布局PosTion :fixedTitle.left{float:left;}.right{float:right;}.head{height:58px;background-color:#3c3c3c;}.head .fontsquarl{width:120px;height:58px;background-color:#F22E00;line-height:58px;}.head .logosuqarl{width:120px;height:58px;background-color:#…

2.5d generator 2.0_ps插件【2.5D插件】

近一两年来创意插画在视觉上的使用越来越多&#xff0c;设计师们都愈加倾向于使用漂亮的插画和产品结合让自己的设计脱颖而出。在最近这段时间新涌现的设计作品当中&#xff0c;强烈的视觉冲击力和产品结合的展现是它们共通的特点。那么2.5D插画也是作为近一两年的发展趋势&…

人工神经网络_制作属于自己的人工神经网络

在本文中&#xff0c;我已经实现了具有Dropout和L2正则化的人工神经网络的完全向量化代码。在本文中&#xff0c;我实现了一个在多个数据集上测试的人工神经网络的完全向量化python代码。此外&#xff0c;并对Dropout和L2正则化技术进行了实现和详细说明。强烈建议通过人工神经…

[leedcode 52] N-Queens II

Follow up for N-Queens problem. Now, instead outputting board configurations, return the total number of distinct solutions. public class Solution {//本题类似于N-Queens&#xff0c;这个更简单一些&#xff0c;只需要求出解法的个数即可&#xff0c;因此没有了prin…

uinty粒子系统子物体变大_Unity2018粒子系统全息讲解,坑深慎入(3)

马上注册&#xff0c;加入CGJOY&#xff0c;让你轻松玩转CGJOY。您需要 登录 才可以下载或查看&#xff0c;没有帐号&#xff1f;立即注册x200357v0p9jufzelwj0uuj.jpg (60.94 KB, 下载次数: 16)2018-6-11 20:22 上传声明&#xff01;声明&#xff01;声明&#xff01;这不会让…

第16/24周 SQL Server 2014中的基数计算

大家好&#xff0c;欢迎回到性能调优培训。上个星期我们讨论在SQL Server里基数计算过程里的一些问题。今天我们继续详细谈下&#xff0c;SQL Server 2014里引入的新基数计算。 新基数计算 SQL Server 2014里一个增强是新的基数计算。上个星期你已经学到老基数计算有些限制&…

mysql主从复制不同步案例_Mysql主从不同步问题处理案例

在使用Mysql的主从复制架构中&#xff0c;有两个比较头疼的问题&#xff1a;1、主从数据不同步后如何处理2、主从同步延迟问题如何解决本文将根据实际案例来分析下问题1&#xff0c;至于问题2多数文档介绍的办法是启用多线程复制来解决&#xff0c;言归正传&#xff0c;这里的问…

python3.6生成exe_Python 3.6打包成EXE可执行程序的实现

1、下载pyinstaller python 3.6 已经自己安装了pip&#xff0c;所以只需要执行 pip install pyinstaller就可以了2、打包程序 进入到你你需要打包的目录&#xff1b;比如我在H:\xcyk开始打包&#xff0c;执行pyinstaller xxx.py我们发现&#xff0c;竟然报错&#xff01;&#…

opencvpython教程百度云资源_Python+OpenCV图像处理入门,视频教程下载

课程介绍&#xff1a; 李老师讲课生动、深入浅出&#xff0c;出版OpenCV编程案例详解、Python-OpenCV图穷录、MATLAB图像处理、MATLAB图像案例教程等在线课程。 本课程系统概括了Python-OpenCV的使用方法&#xff0c;让学习者快速入门。根据本课程规划的图书《Python-OpenCV图穷…

将结构体写入文件_将COCO检测结果写入json文件

最近很多朋友留言问我如何将检测结果写入json文件并且用于COCO API的评估&#xff0c;之前对于检测结果的格式已经做了简单的说明&#xff0c;这里提供一些简单的函数&#xff0c;直接调用将结果写入即可。用于COCO API测试的文件格式HUST小菜鸡&#xff1a;用于COCO API测试的…