![](https://img-blog.csdnimg.cn/20190918140145169.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
C++多线程
以C++并发编程实战为基础,学习过程中的一些心得和笔记
或许 没有
这个作者很懒,什么都没留下…
展开
-
C++多线程之旅实战-线程池的理解
前言在很多公司小组都需要使用会议室进行讨论,但是每个小组都配备一个会议室又会很浪费。所以就将所有的会议室都拿出来放到一起,那个小组需要就像行政部门申请即可,根据申请的先后顺序使用会议室。使用完成以后自动归还,无需派专人进行管理。基于这一思路,我们也可以把线程资源放到一个区域,然后根据每个用户的需求分配线程资源。并且还可以实现自动化的线程资源分配。设计线程池有几个关键的问题:第一,线程中应该创建几个工作线程;第二,是否应该等待线程执行结束…第一个线程#include <thread>#原创 2020-07-23 20:50:43 · 295 阅读 · 0 评论 -
C++多线程之旅实战-无锁数据结构
目录前言实例无锁数据结构的原则总结前言前面的自旋锁可以实现非阻塞数据结构,自旋锁的优点就是在于线程一直处于执行状态,而且线程不需要唤醒,执行效率较高。但是会一直占用CPU资源,导致资源的浪费。但是还有一种无锁数据结构是,是可以实现多于一个线程的并发地访问此数据结构。无锁数据结构的优点与缺点可以实现最大程度的并发,有可能一个线程必须阻塞,并可以继续前等待另一个线程完成其操作;强健壮性,当一个线程在持有锁的时候终止,那么这个数据结构将会被永久破坏,但是无锁数据结构终止时,就不会丢失任何数据。实例原创 2020-07-10 20:27:37 · 599 阅读 · 0 评论 -
C++多线程之旅实战-自旋锁那点事
目录前言实现优缺点缺点优点适用场景Ticket LockCLH LockMCS Lock总结前言前一篇文章讲的是带锁的并发数据结构,而且讲到了如果不带锁将会面临什么样的问题。这一部分我将为大家带来一个全新的数据结构-自旋锁。这是一种不使用阻塞库的数据结构,我们将不使用阻塞库的结构称为非阻塞,但是不是所有的非阻塞数据结构都是无锁的。阻塞函数就是当这个函数不执行完,函数所在线程就一直停止在这里不动。比如最常见的在多线程里面的thread库基本上都是阻塞函数。实现自旋锁(spinlock):是指当一个原创 2020-07-07 21:10:47 · 816 阅读 · 0 评论 -
C++多线程之旅实战-带锁的并发数据结构
目录前言最小化锁粒度确保锁的正确性线程启动时间总结前言前面几部分都是讲的并发编程的一些理论知识,包括线程概念、互斥元的使用、异步线程的使用、原子类型等等。但是这都是纸面上的知识,还没有应用到实战上,而且关于并发还有一些设计技巧,比如 程序段1 // 无需独占 程序段2 // 访问内存空间 程序段3 // 打印到屏幕有两种加锁方式 方式一: 方式二: lock(); 程序段1 程序段1 lock(); 程序段2 程序原创 2020-07-05 20:32:18 · 571 阅读 · 3 评论 -
C++多线程之旅-内存模式和内存屏障
目录前言synchronizes-with和happens-before内存顺序顺序一致模式宽松模式获得/释放模式消费/释放模式内存屏障总结前言前面的线程都是随机进行的,但是在内存中应该是有一个先后顺序的。至于先后顺序如何规定那就要取决于内存模型。下面看一个例子:vector<int> data;atomic<bool> data_ready(false);void reader(){ while (!data_ready.load()) this_原创 2020-07-01 19:43:34 · 1746 阅读 · 1 评论 -
C++多线程之旅-atomic原子类型
目录前言atomic前言多线程的一个重要问题就是并发,但是这个并发不是简单的一个线程访问A段内存,一个线程访问B段线程,这样显然不会出现任何问题。但是一旦两个线程同时访问同一段内存就会出现未知的错误。在前面讲过了使用互斥元的方法,可以保证只有一个线程能访问易发生冲突的内存区域。另外一种方法就是使用原子变量同步。atomic原子类型在头文件<atomic>中,使用atomic有两套命名模式:一种是使用替代名称,一种是使用atomic的特化。原子类型对应特化atomic原创 2020-06-27 20:40:13 · 3317 阅读 · 7 评论 -
C++多线程之旅-future等待事件
目录前言future总结前言前一篇文章讲到了关于condition_variable的使用,但是这种方法太过于底层了,不是很方面,而且需要对调用方进行操作。这样对于程序员来说太过于麻烦,引入一个全新的接口,让被调用的线程自动进行,调用线程直接调用结果就行。这就是C++引入的future()类,而且这种方式可以在不同线程之间传递数据。我们首先假设情况现在有两个线程,线程A等待线程B执行结果,线程B执行完成之后将结果返回给线程A。之前在condition_variable里面是在线程外定义一个全局变量,但原创 2020-06-26 17:40:14 · 3642 阅读 · 0 评论 -
C++多线程之旅-条件变量condition variables
目录前言传统方法条件变量notify_all()¬ify_one()wait_for()&wait_until()伪唤醒总结前言前一篇文章讲到了线程同步问题 ,但是有一种情况需要考虑:线程B需要线程A结束之后才能继续进行,但是如何来得知线程A已经结束了呢?没有学过线程之前可以使用标识符flag标识线程A是否结束,但是此时线程B需要一直去检查标识符flag。虽然空循环不会对线程有很大的影响,但是还有会一直占用线程。有没有一种机制,在线程A完成以后自动通知线程B然后线程B才载入运行。今天我们就来讲一原创 2020-06-23 21:53:46 · 411 阅读 · 0 评论 -
C++多线程之旅-线程同步问题
目录前言互斥元保护数据互斥元死锁互斥元所有权总结前言在前一篇文章中可以实现简单的线程创建,但是会出现一个问题就是,在cout打印输出的时候会出现莫名其妙的乱序。void fun(){ cout << "this_thread::id = " << this_thread::get_id() << endl;}int main() { vector<thread> vec; for (int i = 0; i < 100;原创 2020-06-22 21:08:55 · 374 阅读 · 1 评论 -
C++多线程之旅-初入C++多线程
目录走进线程多进程编程和多线程编程从hello world开始走进线程最近狂喊的 AMD YES,就是一个极强的线程撕裂者。推出的移动端CPU都已经达到了8核16线程,但是很多应用对多线程优化不好,导致多核性能更强的AMD在有的方面还不如牙膏厂-Intel。如何提升多线程编程能力,就需要大量积累。尤其是在服务器编程方面,我们实验室购置的服务器都是48核了,如果还是依靠单线程那就显得太low了。多进程编程和多线程编程多进程编程和多钱程编程,都可以使用并行机制来提升系统的运行效率。二者的区别在于运行时所原创 2020-06-21 16:24:55 · 1004 阅读 · 3 评论