
C++11多线程编程
文章平均质量分 78
Mango酱
这个作者很懒,什么都没留下…
展开
-
14C++11多线程编程之Windows临界区和各种互斥量(recursive_mutex,std::timed_mutex,recursive_timed_mutex)
1 Windows临界区1)Windows临界区与C++11的mutex的区别:mutex不能多次lock,而Windows的临界区可以多次进入,即EnterCriticalSection,但是进入多少次临界区就需要多次LeaveCriticalSection离开临界区。若少解锁即多上锁,它不会报错,但是它的现象的只会在该线程工作。看下图,当我inMsg少解锁了一篇,只在inMsg中插入。2)正确的Windows临界区代码#include<iostream>#include&l原创 2021-01-03 17:22:08 · 362 阅读 · 0 评论 -
13C++11多线程编程之std:: async与std::thread的区别
1 std:: async与std::thread的区别1)std:: async:主要是用于创建一个异步任务,当系统资源紧张时有可能不创建线程或者创建线程失败。并且当枚举宏为std::launch::defered时,肯定不会创建线程并且只有调用get或者wait才开始执行异步任务。2)std::thread:而thread是必定创建线程。当然系统资源紧张也会可能创建失败。3)std::async函数模板更加容易拿到线程函数的返回值,所以更想要拿返回值的,可以使用std::async。4)若不是原创 2021-01-03 15:22:15 · 1115 阅读 · 0 评论 -
12C++11多线程编程之原子操作std::atomic
1 原子操作std::atomic相关概念前言:原子操作:更小的代码片段,并且该片段必定是连续执行的,不可分割。1.1 原子操作std::atomic与互斥量的区别1)互斥量:类模板,保护一段共享代码段,可以是一段代码,也可以是一个变量。2)原子操作std::atomic:类模板,保护一个变量。1.2 为何需要原子操作std::atomic上面可以看到,为何已经有互斥量了,还要引入std::atomic呢,这是因为互斥量保护的数据范围比较大,我们期望更小范围的保护。并且当共享数据为一个原创 2021-01-03 14:43:51 · 2748 阅读 · 0 评论 -
11C++11多线程编程之async、future、packaged_task、promise、std::shared_future
1 async与future开启一个后台任务1.1 概念1)async:函数模板。称为异步机制,参数为可调用对象,返回值为一个future类型的值。2)future:类模板。future对象里会存放一个值,在将来的某个时刻能够拿到。实际上是通过std::future对象的get()成员函数,它的作用为若任务未执行完毕,则阻塞等待线程执行结束,获取线程函数的返回值,否则直接可以获取返回值。3)所以开启后台任务的作用是:能让主线程和某个任务同时进行,当我们想要的结果的时候就调用get阻塞获取。可以节省原创 2021-01-03 11:44:40 · 547 阅读 · 0 评论 -
10C++11多线程编程之条件变量std:: condition_variable、wait()、notify_one()、notify_all()
1 为何引入条件变量解决while不断循环收发消息,让它只有消息到来时才进行处理。大大减少CPU的使用率和提高程序效率。2 条件变量std:: condition_variablestd:: condition_variable实际上是个类,是一个与条件相关的类,说白了就是等待一个条件的达成。这个类是需要和互斥量来配合工作的,使用时定义一个该类对象即可。实例代码:线程A:循环等待一个条件满足,但若条件不满足会休眠在条件变量,并不会占用CPU。线程B:专门往消息队列扔消息(数据),然后通知其它线程原创 2021-01-02 17:31:16 · 2052 阅读 · 0 评论 -
08C++11多线程编程之unique_lock类模板
08C++11多线程编程之unique_lock类模板1 unique_lock概念当不加参数时,同样和lock_guard一样能自动上锁解锁,参数2比lock_guard更加灵活,效率比lock_guard低点内存也占用大点。看个人喜欢用哪个。注:由于不加参数时unique_lock是和lock_guard一样,所以这里就不给出unique_lock无参数2的代码例子。2 unique_lock的第二个参数1)std::adopt_lock:表示在创建unique_lock之前已经上锁了。若没上原创 2021-01-01 23:10:25 · 391 阅读 · 0 评论 -
07C++11多线程编程之死锁概念,演示及一般解决和使用std::lock解决并且使用lock_guard的参数2让std::lock自动解锁
07C++11多线程编程之死锁概念,演示及一般解决和使用std::lock解决并且使用lock_guard的参数2让std::lock自动解锁1 死锁概念C++ 中:1)必须有两把锁以上并且是多个线程下才能产生死锁问题。注:多个单例是不会造成死锁问题的,因为单例获取对象的时候必定立马解锁并且只执行一次。所以也可以说多个单例与一个锁是必定不会造成死锁。考虑死锁问题不需要考虑单例内的锁头。2)假设有A,B线程。A拥有m1锁,尝试拿m2锁;B拥有m2锁,尝试拿m1锁,那么此时他们都各自卡死在获取各自的原创 2021-01-01 14:13:11 · 1005 阅读 · 0 评论 -
06C++11多线程编程之lock_guard类模板
06C++11多线程编程之lock_guard类模板1 lock_guard概念1)lock_guard是一个类模板,它是mutex的进化版,自动lock()和unlock。类似独占型智能指针unique_ptr,是一个保姆。在lock_guard生命周期结束自动释放锁,智能指针自动释放new出来的内存。2)使用lock_guard后不能再使用lock和unlock,否则会出现程序不稳定甚至崩溃。下面写一段lock_guard的伪代码:#include <iostream>#in原创 2021-01-01 14:08:42 · 736 阅读 · 0 评论 -
05C++11多线程编程之使用正确的共享代码案例引入互斥量mutex的概念、用法
05C++11多线程编程之使用正确的共享代码案例引入互斥量的概念、用法、死锁演示及解决详解1 共享代码案例概念分析1)网络游戏服务器。两个自己创建的线程,一个线程收集玩家命令(一个数字代表玩家发来的命令),并把命令写到一个队列中;另外一个线程从队列中取出玩家送来的命令,解析,然后执行玩家需要的动作。2)但是,很多时候我们可以利用该思想进行衍生。例如有一个回调函数分为上下线的玩家ID,我们需要处理这些触发回调的上下线玩家id。那么我们就可以将这些上下线作为switch的case 值,玩家id作为原创 2021-01-01 11:10:26 · 223 阅读 · 0 评论 -
04C++11多线程编程之创建多个线程和数据共享问题分析
04C++11多线程编程之创建多个线程和数据共享问题分析1 thread循环创建多个子线程思想就是使用容器创建多个线程,推荐,以后工作中会使用到,具有实际意义,方便统一管理线程。#include<iostream>#include<thread>#include<string>#include<vector>using namespace std;void MyPrint(int i) { cout << "my tid =原创 2020-12-31 20:20:31 · 666 阅读 · 0 评论 -
03C++11多线程编程之测试join,detach传各种实参时形参的拷贝次数
03C++11多线程编程之测试join,detach传各种实参时形参的拷贝次数首先我们看下面的总结测试图,然后一步步的测试。1 这里我们先测试join传实参的类型当实参为普通对象时:1)当形参为普通对象时,拷贝了两次。2)当形参为引用时:拷贝了一次。3)当形参为指针时:无拷贝。当实参为临时对象时:1)形参为值时,拷贝了两次。2)形参为引用时,拷贝了一次,并且在主线程拷贝构造完毕。3)当形参为指针时:无拷贝。当实参为引用时:1)当形参为普通对象时:拷贝一次。2)当形参原创 2020-12-29 22:14:15 · 219 阅读 · 0 评论 -
02C++11多线程编程之detach传参详解
02C++11多线程编程之detach传参详解这篇文章将介绍我们在使用detach时如何传参给子线程。1 detach传参为引用#include<iostream>#include<thread>#include<string>using namespace std;void myprint1(const int &i){ //打印i的地址看是否是引用 cout << &i << endl; cout原创 2020-12-27 20:57:10 · 1207 阅读 · 0 评论 -
01C++11多线程编程之thread,join,detach,joinable以及简说detach传引用地址的大坑
C++11多线程编程之thread,join,detach,joinable1 thread类对象创建线程与join回收线程1)thread创建线程很简单,定义一个对象然后传一个可调用对象即可。可调用对象:普通的回调函数,类内重载括号()运算符传类对象,lambda表达式,packed_task模板类打包任务等等都可以。2)线程回收join的原因:主要目的是回收进程控制块PCB,保存了一些线程函数返回值等内容,若不回收可能top查看VIRT虚拟内存和RES进程所占内存比较大,因为一般开启一个原创 2020-12-27 17:53:08 · 1223 阅读 · 0 评论