![](https://img-blog.csdnimg.cn/20190927151124774.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
C++并发与多线程
文章平均质量分 63
C++并发与多线程
中国彭于晏杭州分晏
这个作者很懒,什么都没留下…
展开
-
深入理解异步编程
多任务的时候,才会遇到的情况,如:同步、异步,并发、并行。你的朋友在广州,但是有 2 辆小汽车在深圳,需要你帮忙把这 2 辆小汽车送到广州去。,你小汽车,然后坐火车,小汽车去广州。这是串行的方法,2 辆车需要的时间也就更长了。,小汽车从深圳去广州,小汽车从深圳开去广州。这也就是并行方法,两个人两辆车,可以同时行驶,速度很快。,,,停车跑回来,,停车再跑回来,从深圳往广州开。并发的方式,你可以把 2 辆车一块送到朋友手里,但是过程还是很辛苦的。你找一家汽车托运公司,把 2 辆车一起托运到广州。这种方式是同步转载 2022-06-08 16:15:19 · 425 阅读 · 0 评论 -
手写线程池
线程池原理我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题:如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。那么有没有一种办法使得线程可以复用,就是执行完一个任务,并不被销毁,而是可以继续执行其他的任务呢?线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台线程。每个线程都使用默认的堆栈大小,以默认的优先级运行,并处于多转载 2022-02-10 15:02:34 · 116 阅读 · 0 评论 -
《c++新经典》C++11并发与多线程笔记(1)
一 并发基本概念及实现,进程、线程基本概念1、并发、进程、线程的基本概念和综述并发,线程,进程要求必须掌握1.1 并发两个或者更多的任务(独立的活动)同时发生(进行):一个程序同时执行多个独立的任务;以往计算机,单核cpu(中央处理器):某一个时刻只能执行一个任务,由操作系统调度,每秒钟进行多次所谓的“任务切换”。并发的假象(不是真正的并发),切换(上下文切换)时要保存变量的状态、执行进度等,存在时间开销;随着硬件发展,出现了多处理器计算机:用于服务器和高性能计算领域。台式机:在一块芯片上有原创 2022-01-24 20:38:51 · 294 阅读 · 0 评论 -
《c++新经典》C++11并发与多线程笔记(2)
二 线程启动、结束,创建线程多法、join,detach1、范例演示线程运行的开始程序运行起来,生成一个进程,该进程所属的主线程开始自动运行;当主线程从main()函数返回,则整个进程执行完毕主线程从main()开始执行,那么我们自己创建的线程,也需要从一个函数开始运行(初始函数),一旦这个函数运行完毕,线程也结束运行整个进程是否执行完毕的标志是:主线程是否执行完,如果主线程执行完毕了,就代表整个进程执行完毕了,此时,一般情况下:如果其他子线程还没有执行完,也会被强行终止【此条有例外,以后会解释原创 2022-02-02 16:01:14 · 1099 阅读 · 0 评论 -
《c++新经典》C++11并发与多线程笔记(3)
三 线程传参详解,detach()大坑,成员函数做线程函数1 传递临时对象作为线程参数1.1要避免的陷阱1:#include <iostream>#include <thread>using namespace std;void myPrint(const int &i, char* pmybuf){ //如果线程从主线程detach了 //i不是mvar真正的引用,实际上值传递,即使主线程运行完毕了,子线程用i仍然是安全的,但仍不推荐传递引用 //推原创 2022-02-02 16:02:14 · 269 阅读 · 0 评论 -
《c++新经典》C++11并发与多线程笔记(4)
四、创建多个线程、数据共享问题分析、案例代码1.创建和等待多个线程#define _CRT_SECURE_NO_WARNINGS#include <iostream>#include <string>#include <vector>#include <thread>using namespace std;void TestThread(int num){ cout << "TextThread线程开始执行了,线程编号 =原创 2022-02-02 16:02:54 · 857 阅读 · 0 评论 -
《c++新经典》C++11并发与多线程笔记(5)
五、互斥量概念、用法、死锁演示及解决详解1.互斥量(mutex)的基本概念互斥量就是个类对象,可以理解为一把锁,多个线程尝试用lock()成员函数来加锁,只有一个线程能锁定成功,成功的标志是lock()函数返回。如果没有锁成功,那么流程将卡在lock()这里不断尝试去锁定。互斥量使用要小心,保护数据不多也不少,少了达不到效果,多了影响效率。2.互斥量的用法包含#include <mutex>头文件2.1 lock(),unlock()步骤:1.lock(),2.操作共原创 2022-02-02 16:03:38 · 609 阅读 · 0 评论 -
《c++新经典》C++11并发与多线程笔记(6)
六、unique_lock(类模板)详解1.unique_lock取代lock_guardunique_lock比lock_guard灵活很多(多出来很多用法),效率差一点,内存占用多一点。unique_lock<mutex> myUniLock(myMutex);#define _CRT_SECURE_NO_WARNINGS#include <iostream>#include <string>#include <list>#inclu原创 2022-02-02 16:04:28 · 380 阅读 · 0 评论 -
《c++新经典》C++11并发与多线程笔记(7)
七、单例设计模式共享数据分析、解决,call_once1.设计模式程序灵活,维护起来可能方便,用设计模式理念写出来的代码很晦涩,但是别人接管、阅读代码都会很痛苦老外应付特别大的项目时,把项目的开发经验、模块划分经验,总结整理成设计模式中国零几年设计模式刚开始火时,总喜欢拿一个设计模式往上套,导致一个小小的项目总要加几个设计模式,本末倒置设计模式有其独特的优点,要活学活用,不要深陷其中,生搬硬套2.单例设计模式:整个项目中,有某个或者某些特殊的类,只能创建一个属于该类的对象。单例类:只能生成原创 2022-02-02 16:05:02 · 817 阅读 · 0 评论 -
《c++新经典》C++11并发与多线程笔记(8)
八、 condition_variable、wait、notify_one、notify_all1.条件变量condition_variable、wait、notify_one、notify_all原创 2022-02-02 17:15:01 · 511 阅读 · 0 评论 -
《c++新经典》C++11并发与多线程笔记(9)
一、std::async / std::future创建后台任务并返回值希望线程返回一个结果std::async 是个函数模板,用来启动一个异步任务,启动一个异步任务之后,返回一个std::future对象,std::future是一个类模板什么叫“启动一个异步任务”就是自动创建一个线程并开始执行对应的入口函数,它返回一个std::future对象这个std::future对象里面就含有函数返回的结果(线程返回的结果),我们可以通过调用future对象的成员函数get()来获取结果有人也.原创 2022-02-03 14:41:33 · 706 阅读 · 0 评论 -
《c++新经典》C++11并发与多线程笔记(10)
一、std::future的其他成员函数原创 2022-02-04 13:41:45 · 789 阅读 · 0 评论 -
《c++新经典》C++11并发与多线程笔记(11)
一、std::atomic续谈二、std::async深入谈2.1 std::async参数详述2.2 std::async和std::thread的区别2.3 std::async不确定性问题的解决原创 2022-02-04 14:22:00 · 138 阅读 · 0 评论 -
《c++新经典》C++11并发与多线程笔记(12)
一|二、windows临界区Windows临界区,同一个线程是可以重复进入的,但是进入的次数与离开的次数必须相等。C++互斥量则不允许同一个线程重复加锁。windows临界区是在windows编程中的内容,了解一下即可,效果几乎可以等同于c++11的mutex包含#include <windows.h>windows中的临界区同mutex一样,可以保护一个代码段。但windows的临界区可以进入多次,离开多次,但是进入的次数与离开的次数必须相等,不会引起程序报异常出错。#inclu.原创 2022-02-04 15:15:30 · 420 阅读 · 0 评论 -
《c++新经典》C++11并发与多线程笔记(13)
一、补充一些知识点1.1 虚假唤醒:notify_one或者notify_all唤醒wait()后,实际有些线程可能不满足唤醒的条件,就会造成虚假唤醒,可以在wait中再次进行判断解决虚假唤醒。解决:wait中要有第二个参数(lambda),并且这个lambda中要正确判断所处理的公共数据是否存在。1.2 atomic:std::atomic<int> atm = 0; cout << atm << endl;这里只有读取atm是原子操作,但是整个这.原创 2022-02-04 15:42:05 · 101 阅读 · 0 评论