C++多线程
文章平均质量分 85
C++多线程从0到0.1。
Splaying
Studying
展开
-
C++多线程:RAII技术、recursive_mutex、timed_mutex(十二)
recursive_mutex递归的独占互斥量(可重入锁),允许同一个线程对同一个互斥量进行多次lock,效率上比mutex要差一些,重入的次数有限制,次数太多可能报异常。带超时功能的递归互斥量,std::recursive_mutex和std::timed_mutex的结合版本,也没什么新奇的东西。但这个关键区域(CRITICAL_SECTION)与互斥量(Mutex)存在一定的差异,关键区域是可以进行锁重入的,而Mutex并不支持。在使用时应该尽量的减少这个锁的使用,应该优先考虑程序的优化。原创 2024-04-02 15:50:16 · 443 阅读 · 0 评论 -
C++多线程:std::thread与std::async对比(十一)
std::thread是C++11中提供的创建线程的一个手段,它是在<thread>头文件中,它的返回值是一个线程主体对象,主要提供下面几个函数join:调用该指令所在的线程阻塞,等待被调用线程的执行完毕detach:调用该指令所在的线程与被调用线程分离,无须管理被调用线程的生死joinable:判断线程是否可以join和detach,因为这两个方法只能调用一次native_handle:获得句柄,应该是线程执行的入口函数get_id:获取线程id。原创 2024-04-02 11:45:19 · 1042 阅读 · 0 评论 -
C++多线程:Atomic原子类与CAS锁详解(十)
CAS锁绕不开的一个话题,就是ABA问题:就是如果你有一杯水放在桌子上重100g,先被A倒掉了10g,再被B加入了10g其他物质,最后这杯水重还是10g,但是这杯水已经不能喝了(谁也不知道加了什么),即数据被多次操作,但操作后值还是原来的值。因为CAS 需要在操作值的时候,检查值有没有发生变化,如果没有发生变化则更新,但是如果一个值原来是A,变成了B,又变成了A,那么使用CAS 进行检查时会发现它的值没有发生变化,但是实际上却变化了。CAS实现原理:主要设计三个值:旧的预期值A,内存地址值V,新值B。原创 2024-04-01 23:44:04 · 1925 阅读 · 0 评论 -
C++多线程:async、future、packaged_task、promise、shared_future的学习与使用(九)
学习这些东西都是为了将其灵活使用,能够把它们融入到我们自己的实际开发当中能够灵活的写出稳定的多线程并发程序便于我们认识新的东西,通过学习它们可以通过阅读一些高手写的代码从而实现快速的代码积累和开拓眼界。原创 2024-04-01 16:38:37 · 1116 阅读 · 0 评论 -
C++多线程:条件变量condition_variable的使用与实现原理(八)
在wait系列函数调用之前首先需要加锁,在对wait函数进行调用,然后再判断条件是否成立,不成立就释放,成立就继续持有!至多这个词很奇怪,可以换句话来描述:负责叫醒所有持有同一把互斥锁的线程,但有没有用就不知道了。如果调用的函数或者lambda表达式返回为false,那么继续释放锁,继续等待。如果没有线程阻塞在条件变量的锁上,那么通知就是无效的。当条件不满足时,相关线程一直被阻塞,直到某种条件成立,这些线程才会被唤醒。如果没有传入函数或者lambda表达式,那么为true,继续向下执行代码。原创 2024-03-31 16:06:04 · 847 阅读 · 0 评论 -
C++多线程:单例模式与共享数据安全(七)
由于程序运行CPU会进行指令的重排序,如果执行的指令是132顺序,A线程执行完13之后并没有完成对象的初始化、而这时候转到B线程;但这个问题在C++11中已经禁止了重排序,因此不需要使用volatile关键字,但在Java和一些其他语言中可能有,Java中这个关键字是针对即时编译器JIT进行指令重排序的。std::call_once()具有互斥量的这种能力,且效率上比mutex互斥量效率更高,因此也可以使用这个函数对单例的线程安全进行保证。懒汉式:当需要用到的时候再去加载这个对象。原创 2024-03-31 11:25:49 · 937 阅读 · 0 评论 -
C++多线程:unique_lock源码分析与使用详解(六)
unique_lock取代lock_guard,unique_lock更像lock_guard的升级版,也是mutex的管家!unique_lock是个类模板,工作中一般使用lock_guard(推荐使用)lock_guard取代了mutex的lock()和unlock()unique_lock比lock_guard灵活很多,效率差一点,内存占用多一点lock_guard额外参数只能传入std::adopt_lock。原创 2024-03-30 20:27:46 · 1171 阅读 · 0 评论 -
C++多线程:mutex互斥量与死锁(五)
互斥量是一个类对象,理解成一把锁,多个线程尝试用lock()成员函数来加锁这把锁头(成功的标志是lock()函数的返回,不成功将一直阻塞在这把锁上)。而std::lock批量获取锁后为了忘记释放,可以在std::lock_guard中添加参数std::adopt_lock使得在在析构时自动释放锁。这个是std::lock_guard的源码,可以看到lock_guard的源码很简单,在构造时加锁,互斥量需要小心使用,数据(临界区)不能过多或者过少的保护,过少有安全问题,过多有效率问题。原创 2024-03-30 16:24:07 · 821 阅读 · 0 评论 -
C++多线程:创建多个线程与数据共享安全问题(四)
多线程的调度由操作系统负责,线程执行的先后没有严格的顺序完全看操作系统和CPU的心情。原创 2024-03-29 19:29:47 · 249 阅读 · 0 评论 -
C++多线程:thread构造源码剖析与detach大坑(三)
当使用detach方法脱离主线程时需要注意拷贝的问题,绝对不能使用隐式转换。std::ref函数传入引用、std::decay类型衰退、自定义成员函数当线程的回调函数源码的简单剖析,有机会再深入研究。原创 2024-03-29 17:53:29 · 1346 阅读 · 0 评论 -
C++多线程:线程的创建、join、detach、joinable方法(二)
线程的创建方式也可以通过传入一个类对象,并在类内部对函数运算符()进行重载,使用detach或者join都行。public:std::cout原创 2024-03-29 11:24:52 · 2074 阅读 · 0 评论 -
C++多线程:入门基本概念(一)
线程启动更快速,更轻量级系统资源开销少,执行速度更快,需要考虑数据一致性问题。原创 2024-03-28 17:11:15 · 430 阅读 · 0 评论