最新要闻
- 天天速看:深圳居住登记信息服务_深圳市居住登记服务平台
- 焦点播报:游客为拍照不听劝阻喂狐狸吃面包 无视劝阻!会危害动物
- 播报:院线票房止步9000万:《中国乒乓》官宣3月17日登陆线上平台
- 华硕发布新款迷你主机:高配i7-13700H、配备雷电4
- 网传梅西要来 黄牛提前卖票!阿根廷国家足球队辟谣“中国行”
- 【新要闻】315白皮书:价格刺客成消费者年度最关注现象、购物平台为年度被投诉最多行业
- 环球时讯:西安机场为首次坐飞机旅客安排指引服务:佩戴专属手环 全程有人引导
- 速度10倍于普通U盘!联想小新原厂颗粒固态U盘发售:USB 3.2双口
- 12万买C6?想多了!雪铁龙都是套路:想提车先交29万
- 微贺卡
- 《黑暗荣耀2》热播!演员透露拍摄细节:剧里的蛇是真蛇
- 82版《西游记》编剧戴英禄逝世 六小龄童发文悼念
- 当前关注:理想汽车L8首批车主调研:300名中车主开BBA的最多
- 环球播报:国产车崛起 豪华车丝毫不怂:市场份额继续增 有钱人多
- 最新资讯:努比亚Z50 Ultra首销卖爆:获京东/天猫平台销量销售额冠军
- 卡塔尔世界杯官方授权:富光1.5L顿顿桶29元发车
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
每日观点:c++11多线程入门<学习记录>
最近学习了c++多线程相关知识,也算是对这方面内容的入门视频链接c++11并发与多线程视频课程
看了大概两周,简单进行总结参考文章C++11并发与多线程
(相关资料图)
PS:c++11提供了标准的可跨平台的线程库,本次多线程开发以此库
一.并发,进程,线程理解
1.并发:两个或者更多的任务(独立的活动)同时发生(进行):一个程序同时执行多个独立的任务
2.进程:运行起来的可执行程序
3.线程:每个进程有唯一的主进程,可以通过写代码创建其他子线程<一个新线程,代表一条新的代码执行路径>
二.子线程创建与结束
1.线程创建:thread类提供了创建线程的接口 #include
thread myThread(可调用对象); //创建myThread子线程,线程执行参数内代码(或者函数)
c++中的可调用对象可以是函数、函数指针、lambda表达式、bind创建的对象或者重载了函数调用运算符的类对象<称为线程函数>
2.线程结束线程一旦创建,就会与主线程并发进行,此时如果主线程执行完毕,会强制退出程序,因此需要保证子线程在主线程之前执行完毕。库提供两种方式:myThread.join(); //表示此时阻塞主线程,等待子线程执行完毕与主线程汇合,一起结束整个进程
myThread.detach(); //主线程不再与子线程汇合,不再等待子线程
//detach后,子线程和主线程失去关联,主调线程无法再取得该被调线程的控制权,驻留在后台,由C++运行时库接管
<由于detach使线程脱离主线程控制,若该线程使用了主线程或者其他线程中的内容,要注意内容是否有效合法,坑!>
三.线程ID和线程参数
1.线程ID:每一个线程都有自己独一无二的线程ID,可以用std::this_thread::get_id()
来获取目前代码执行位置处于的线程ID
2.线程参数thread myThread(print(), ...);
其中print为函数指针,后续参数就是传入print函数的参数,注意传参格式
四.多个线程创建,数据共享问题
1.多个线程创建可以用STL容器来便于多个线程的创建,如std::verctor
,不过要注意创建一个线程要给对应的join或者detach函数,让线程可控
2.数据共享多线程程序要注意对共享数据的管理,由于线程执行顺序随机性,若对共享数据同时进行读和写,会导致读数据的一方得到脏数据,而写的一方修改混乱<若线程都只读共享数据,可无需管理>
五.互斥量和死锁
1.互斥量 #include
对共享数据的管理,最简便也是最佳方案就是用mutex锁进行管理mutex类似一把锁,锁住共享数据部分,如果需要访问共享数据时,先要查看目前锁是否打开,若锁打开则进入访问数据,并且锁上防止其他线程进入,访问结束后解锁;若锁未打开则在外循环等待直到锁打开
std::mutex myMutex;myMutex.lock();//...共享数据myMutex.unlock();
互斥量锁上了一定要记得打开,不然后续无法读取数据且线程会卡死类似于指针,要释放内存。因此也有lock_guard类模板,和智能指针一样,创建时自动调用lock,作用域外自动调用unlockstd::lock_guard
std::mutex myMutex;{ std::lock_guard myGuard(myMutex); //lock //...共享数据} //unlock
2.死锁两个或两个以上的互斥量,由于在进程中锁的顺序不一样,导致两个或多个进程相互等待对方锁住的锁时,就产生了死锁。
<两个互斥量mutex1,mutex2。>a.线程A执行时,这个线程先锁mutex1,并且锁成功了,然后去锁mutex2的时候,出现了上下文切换。b.线程B执行,这个线程先锁mutex2,因为mutex2没有被锁,即mutex2可以被锁成功,然后线程B要去锁mutex1.c.此时,死锁产生了,A锁着mutex1,需要锁mutex2,B锁着mutex2,需要锁mutex1,两个线程没办法继续运行下去。。。
只要保证多个互斥量上锁的顺序一样就不会造成死锁。
六.unique_lock类模板
<很类似unique_ptr>unique_lock可以取代lock_guard,理解为更加灵活的lock_guard,但效率相对较低
1.第二参数:std::adopt_lock:表示这个互斥量已经被lock(),即不需要在构造函数中lock这个互斥量了
std::try_to_lock:尝试用mutex的lock()去锁定这个mutex,但如果没有锁定成功,会立即返回,不会阻塞在那里
std::defer_lock:如果没有第二个参数就对mutex进行加锁,加上defer_lock是始化了一个没有加锁的mutex
2.常用成员函数:lock():加锁
unlock():解锁
try_lock():尝试给互斥量加锁如果拿不到锁,返回false,否则返回true。
release():解除与锁的绑定,返回它所管理的mutex对象的指针,并释放所有权
七.条件变量
1.condition_variable:为一个类,为互斥量解锁设定条件
std::mutex mymutex1;std::unique_lock sbguard1(mymutex1);std::condition_variable condition;condition.wait(sbguard1, [this] {if (!msgRecvQueue.empty()) return true; return false; }); //锁 + 解锁条件 condition.wait(sbguard1); //不建议这么写
2.notify_one、notify_allwait阻塞时,如果接收到其他地方的notify指令,则会尝试解锁.a)如果lambda表达式为true,则wait返回,流程可以继续执行(此时互斥量已被锁住)b)如果表达式为false,那wait又对互斥量解锁,然后又休眠,等待再次被notify_one()唤醒<无第二参数默认为true>PS:由于多线程执行随机性,可能会出现虚假notify,notify的时候wait线程不处于wait
notify_one():通知一个线程的wait()notify_all():通知所有线程的wait()
八.async、future、packaged_task、promise
1.async、future
std::future对象,为类模板。“future”将来的意思,也有人称呼std::future提供了一种访问异步操作结果的机制,就是说这个结果你可能没办法马上拿到,但是在不久的将来,这个线程执行完毕的时候,你就能够拿到结果了,所以,大家这么理解:future中保存着一个值,这个值是在将来的某个时刻能够拿到
std::future对象的get()成员函数会等待线程执行结束并返回结果,拿不到结果它就会一直等待,感觉有点像join()。但是,它是可以获取结果的。std::future对象的wait()成员函数,用于等待线程返回,本身并不返回结果,这个效果和std::thread 的join()更像。
2.std::packaged_task:打包任务,把任务包装起来为类模板,它的模板参数是各种可调用对象,通过packaged_task把各种可调用对象包装起来,方便将来作为线程入口函数来调用。
int mythread(int mypar){...}std::packaged_task mypt(mythread);//用法一std::thread t1(std::ref(mypt), 1);t1.join();std::future result = mypt.get_future(); cout << result.get() << endl;//用法二,直接调用mypt(1);std::future result = mypt.get_future();cout << result.get() << endl;
3.std::promise类模板我们能够在某个线程中给它赋值,然后我们可以在其他线程中,把这个值取出来
九.future其他成员函数、shared_future、atomic
1.future其他成员函数std::future_status status = result.wait_for(std::chrono::seconds(5s));
卡住当前流程,等待std::async()的异步任务运行一段时间,然后返回其状态std::future_status。std::future_status是枚举类型,表示异步任务的执行状态。类型的取值有std::future_status::timeout //时间耗尽,还未运行结束std::future_status::ready //运行结束std::future_status::deferred //async为deferred状态
2.std::shared_future:也是个类模板std::future的 get() 成员函数是转移数据std::shared_future 的 get()成员函数是复制数据
3.std::atomic原子操作<“不可分割的操作”>原子操作,指的是执行该操作时,CPU不会强制切换时间片,必须等该操作完全执行完成,才会切换时间片,因此可以保护数据合法性。和互斥量类似,但从效率上来说,原子操作要比互斥量的方式效率要高。互斥量的加锁一般是针对一个代码段,而原子操作针对的一般都是一个变量。
#include std::atomic g_count = 0; //封装了一个类型为int的 对象(值)void mythread1() {for (int i = 0; i < 1000000; i++) {g_count++;}}nt main() {std::thread t1(mythread1);std::thread t2(mythread1);t1.join();t2.join();cout << "正常情况下结果应该是次,实际是" << g_count << endl; //2000000}
十.std::atomic续谈、std::async深入谈
1.一般atomic原子操作,针对++,--,+=,-=,&=,|=,^=是支持的,其他操作不一定支持。
2.std::async深入理解第二参数:std::launch::deferred【延迟调用】std::launch::async【强制创建一个线程】如果同时用 std::launch::async | std::launch::deferred这里这个 | 意味着async的行为可能是 std::launch::async 创建新线程立即执行, 也可能是 std::launch::deferred 没有创建新线程并且延迟到调用get()执行,由系统根据实际情况来决定采取哪种方案<若无第二参数,这种为默认值>
async不确定性问题的解决不加额外参数的async调用时让系统自行决定,是否创建新线程。std::future
std::future_status status = result.wait_for(std::chrono::seconds(6));//std::future_status status = result.wait_for(6s);if (status == std::future_status::timeout) {//超时:表示线程还没有执行完cout << "超时了,线程还没有执行完" << endl;}else if (status == std::future_status::ready) {//表示线程成功放回cout << "线程执行成功,返回" << endl;cout << result.get() << endl;}else if (status == std::future_status::deferred) {cout << "线程延迟执行" << endl;cout << result.get() << endl;}
十一. windows临界区、其他各种mutex互斥量
1.windows临界区Windows临界区,同一个线程是可以重复进入的,但是进入的次数与离开的次数必须相等。C++互斥量则不允许同一个线程重复加锁。
#include CRITICAL_SECTION my_winsec;//windows中的临界区,非常类似C++11中的mutexInitializeCriticalSection(&my_winsec);//用临界区之前要初始化EnterCriticalSection(&my_winsec);//进入临界区// ....LeaveCriticalSection(&my_winsec);//离开临界区
2.其他各种mutex互斥量递归独占互斥量std::recursive_mutex:允许在同一个线程中同一个互斥量多次被 lock() ,(但是递归加锁的次数是有限制的,太多可能会报异常),效率要比mutex低。
带超时的互斥量std::timed_mutex 和 std::recursive_timed_mutex:判断是否拿到锁,若未拿到可以继续执行其他代码
十二.线程池浅谈、线程数量谈
1.线程池把一堆线程弄到一起,统一管理。这种统一管理调度,循环利用的方式,就叫做线程池。实现方式:程序启动时,一次性创建好一定数量的线程。这种方式让人更放心,觉得程序代码更稳定。
2.数量谈A、线程创建的数量极限的问题一般来讲,2000个线程基本就是极限;再创建就会崩溃。
B、线程创建数量建议a、采用某些计数开发程序提供的建议,遵照建议和指示来确保程序高效执行。b、创建多线程完成业务;考虑可能被阻塞的线程数量,创建多余最大被阻塞线程数量的线程,如100个线程被阻塞再充值业务,开110个线程就是很合适的c、线程创建数量尽量不要超过500个,尽量控制在200个之内;
END<信号量呢??>
关键词:
-
当前通讯!day03-分析SpringBoot底层机制
分析SpringBoot底层机制Tomcat启动分析,Spring容器初始化,Tomcat如何关联Spring容器?1 创建SpringBo...
来源: -
关于AWS-S3-Bucket-Console-Web控制页面上的Creation date与命令行-API方式如何获取到真正的CreationDate
首先,说明一下,在AWSS3BucketConsoleweb界面看到的Createdate这个日期是真正的s3桶子的创建的日期当s3...
来源: 每日观点:c++11多线程入门<学习记录>
当前通讯!day03-分析SpringBoot底层机制
关于AWS-S3-Bucket-Console-Web控制页面上的Creation date与命令行-API方式如何获取到真正的CreationDate
天天速看:深圳居住登记信息服务_深圳市居住登记服务平台
焦点播报:游客为拍照不听劝阻喂狐狸吃面包 无视劝阻!会危害动物
Vue——mergeOptions【四】
播报:院线票房止步9000万:《中国乒乓》官宣3月17日登陆线上平台
华硕发布新款迷你主机:高配i7-13700H、配备雷电4
环球热点评!.NET中比肩System.Text.Json序列化反序列化组件MessagePack
路飞-项目上线
今亮点!分布式架构-可观测性-事件日志
【全球热闻】教你用Python画个可爱的皮卡丘!(附完整源码)
每日资讯:Educational Codeforces Round 123 (Rated for Div. 2)
网传梅西要来 黄牛提前卖票!阿根廷国家足球队辟谣“中国行”
【新要闻】315白皮书:价格刺客成消费者年度最关注现象、购物平台为年度被投诉最多行业
环球时讯:西安机场为首次坐飞机旅客安排指引服务:佩戴专属手环 全程有人引导
速度10倍于普通U盘!联想小新原厂颗粒固态U盘发售:USB 3.2双口
12万买C6?想多了!雪铁龙都是套路:想提车先交29万
记录--你不知道的forEach函数
智能勘探 | AIRIOT智慧油田管理解决方案
环球聚焦:NOI春季测试游记
微贺卡
《黑暗荣耀2》热播!演员透露拍摄细节:剧里的蛇是真蛇
82版《西游记》编剧戴英禄逝世 六小龄童发文悼念
当前关注:理想汽车L8首批车主调研:300名中车主开BBA的最多
环球播报:国产车崛起 豪华车丝毫不怂:市场份额继续增 有钱人多
最新资讯:努比亚Z50 Ultra首销卖爆:获京东/天猫平台销量销售额冠军
报道:第一章 软件工程概述
每日看点!centos7.9离线升级openssl和openssh9.2
python语言基础
每日焦点!Mysql数据库未添加索引引发的生产事故
对极几何的理解和原理推导
卡塔尔世界杯官方授权:富光1.5L顿顿桶29元发车
焦点精选!零碳排放!我国首款双源智能重卡成功下线:自带大辫子
视焦点讯!全球打广告最划算的一块屏?登上纽约时代广场屏幕只需40美元
《狂飙》后 张译宣传新剧《他是谁》:今晚优酷、央视开播
获赔近100万 报废奔驰翻新再销售被判退1赔3 网友:C级秒变大S
每日快讯!10Wqps 超高并发 API网关 架构演进之路
Egg.js 学习笔记01
世界快看:git提交规范
【全球速看料】早起、冥想、阅读、写作、运动
焦点讯息:观察者模式——学习笔记
天天最新:dnf游戏闪退怎么解决方法_dnf游戏闪退
停车场闸机防骗能力太弱鸡:博主实测一部手机、一张纸均可通行
曾模仿东方甄选直播带货 好未来旗下学而思大规模重启线下招生
白皮书:购物平台为2022年度消费者投诉最多的行业
天天播报:315前海鲜加工厂的狠活被曝光:硼砂泡出黄金鲍 系明令禁止食品添加剂
世界焦点!两只售价3899元:华硕ROG推出魔方幻路由器月曜白限定版
卷起来!!!看了这篇文章我才知道MySQL事务&MVCC到底是啥?
蓝牙Mesh简介(一)设备标识:UUID和Mesh地址
开源免费:分享powershell读写k8s的etcd的脚本库
环球速递!冲击全球的“硅谷银行破产”到底咋回事?会不会引爆危机?
视点!国产AYA新掌机Ayaneo 2 IGN9分好评:价格贵 但很好用!
【聚看点】央视3·15晚会官宣明晚举办 这次谁会被曝光?
世界最资讯丨配置大升级!新款比亚迪唐DM-i/汉EV冰川蓝实车亮相:绝对吸睛
上海测试9辆自动驾驶清扫车 可替代25名环卫工人
干货来袭!3天0基础Python实战项目快速学会人工智能必学数学基础全套(含源码)(第3天)概率分析篇:条件概率、全概率与贝叶斯公式
韩国电视台剪掉杨紫琼获奖感言:鼓励女性部分没了
腾讯会议重大调整!取消免费300人不限时会议使用
世界看热讯:斥资10亿美元!NASA将开发太空拖船:实现国际空间站受控坠落
那些曾被315点过名的品牌怎么样了?英菲尼迪道歉并更换变速箱 汉堡王被罚
实时焦点:车圈大V杨学良晒魅族20 Pro真机:极简设计 好看又好用!
与微软聊天机器人对话
Vue项目迁移小程序,实操干货分享
戴尔PC要100%离开中国!完整时间表曝光:真着急
天天微资讯!韩媒称特斯拉停止与比亚迪合作 马斯克:虚假报道、双方关系积极
魔兽世界将推出全新硬核玩法:一命通关、挂了就得重来
ai文件怎么打开?ai文件用什么软件打开和编辑?
斐讯k1支持千兆吗?斐讯k1路由器怎么设置?
windows如何一键还原?windows截图保存在哪里?
声卡怎么调试?声卡什么牌子的音质比较好?
笔记本fn键在哪里?fn键怎么开启和关闭?
每日短讯:可插拔组件设计机制—SPI
今日热讯:Vim 备忘清单_开发速查表分享
世界头条:Linux进程的创建与销毁
鲨鱼求偶被误认吃“同事” 官方回应:是繁殖行为 撕咬有分寸
天天热文:减肥不吃主食?医生提醒:可致大脑功能衰退
全球热消息:《小丑2》Lady Gaga小丑女新片场照 造型太好看了
全球报道:极速直追中国高铁!碳陶瓷刹车套件特斯拉Model S Plaid打破单圈纪录
【全球报资讯】一键开盖:哈尔斯600ml水杯9.9元狂促 Tritan材质款23.9元
天天热头条丨阳高县气象台发布大风蓝色预警【Ⅳ级/一般】
全球微头条丨java操作excel文件——POI
天天讯息:剑指 Offer 68 - II. 二叉树的最近公共祖先(java解题)
分布式架构-可观测性
obs studio 插件
看热讯:小米子公司发通告:拼多多、京东、淘宝上的“紫米官旗”不是我
硅谷银行停业没影响!贾跃亭要“翻身”:4月26日FF91终极发布
世界今日讯!德国反对2035禁售燃油车!欧盟做出让步:内燃机还有活路
天天观热点:Intel要求电源厂商使用单一规格制作12VHPWR接头
马斯克减肥神药遭疯抢!欧洲药管局警告:2023年都会短缺
天天热讯:DockQuery | 基于E-R图的数据建模功能使用实践
宝马iX3高速撞车 车主:车道纠偏系统和自己抢方向盘酿事故
环球最新:公司回应因给客户倒水太满开除员工:该走啥程序走啥程序
新机型“无可奉告”:任天堂称对Switch未来充满信心
【全球速看料】史上最大规模!魅族领克无界生态发布会官宣:魅族20系列、Flyme 10来了
全球视点!一加逆袭!成为2023年销量增速最快的品牌:友商普遍下滑
共314套房源!昌平区公租房配租公告来了
焦点资讯:GO语言学习笔记-测试篇 Study for Go ! Chapter ten- Test
要闻速递:面试官:怎么删除 HashMap 中的重复元素?第 3 种实现思路,99% 的人不会!
世界快消息!k8s的Helm 工具安装