![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
c++ concurrency in action
鹿几三三
这个作者很懒,什么都没留下…
展开
-
第三章 线程间共享数据
第三章 线程间共享数据3.1 共享数据带来的问题3.2 使用互斥量保护共享数据3.1 共享数据带来的问题条件竞争当不变量遭到破坏时,才会产生条件竞争。恶性条件竞争通常发生于完成对多于一个的数据块的修改时。3.2 使用互斥量保护共享数据任何一个线程在执行这些代码时,其他任何线程试图访问共享数据结构,就必须等到那一段代码执行结束。这样其它线程就不会破坏不变量了。具体操作:当访问共享...原创 2019-07-29 15:11:16 · 276 阅读 · 0 评论 -
std::packaged_task介绍及使用
一、std::packaged_task简介在上一篇,我们介绍了std::promise的使用方法,其实std::packaged_task和std::promise非常相似,简单来说std::packaged_task<F>是对std::promise<T= std::function<F>>中T= std::function<F>这一可调对象(...转载 2019-09-03 16:03:26 · 473 阅读 · 0 评论 -
std::promise介绍及使用
一、std::promise介绍std::promise是C++11并发编程中常用的一个类,常配合std::future使用。其作用是在一个线程t1中保存一个类型typename T的值,可供相绑定的std::future对象在另一线程t2中获取。在主函数(主线程)中声明 promise 及其对应的 future,在某个线程中传入 promise 并进行运算;在另一个线程中出入 future...转载 2019-09-03 15:55:18 · 1811 阅读 · 0 评论 -
第九章 高级线程管理
文章目录9.1 线程池9.1.1 最简单的线程池9.1 线程池将每个任务指定给某个线程是不切实际的,不过可以利用现有的线程,进行并发执行。线程池就提供了这样的功能,提交到线程池中的任务将并发执行,未提交的任务将会挂在任务队列上。队列中的每一个任务都会被池中的工作线程所获取,当任务执行完成后,再回到线程池中获取下一个任务创建一个线程池时,会遇到几个关键性的设计问题,比如:可使用的线程数量,高...原创 2019-08-16 16:38:40 · 136 阅读 · 0 评论 -
第八章 并发代码设计
文章目录8.1 线程间划分工作的技术8.1.1 在线程处理前对数据进行划分8.1.2 递归划分8.1.3 通过任务类型划分工作8.1 线程间划分工作的技术需要决定使用多少个线程,并且这些线程应该去做什么。还需要决定是使用“全能”的线程去完成所有的任务,还是使用“专业”线程只去完成一件事情,或将两种方法混合。8.1.1 在线程处理前对数据进行划分最简单的并行算法:并行化的std::for_...原创 2019-08-14 20:08:39 · 259 阅读 · 0 评论 -
第六章 基于锁的并发数据结构设计
第六章 基于锁的并发数据结构设计6.1 为并发设计的意义何在?6.1.1 数据结构并发设计的指导与建议(指南)6.2 基于锁设计更加复杂的数据结构编写一个使用锁的线程安全查询表6.1 为并发设计的意义何在?设计并发数据结构,意味着多个线程可以并发的访问这个数据结构,线程可对这个数据结构做相同或不同的操作,并且每一个线程都能在自己的自治域中看到该数据结构在互斥量的保护下,同一时间内只有一个线...原创 2019-08-13 22:00:39 · 244 阅读 · 0 评论 -
第5章 C++内存模型和原子类型操作
第5章 C++内存模型和原子类型操作5.1 内存模型基础5.1.1 对象和内存位置5.1.2 对象、内存位置和并发5.2 C++中的原子操作和原子类型5.2.1 标准原子类型5.1 内存模型基础这里从两方面来讲内存模型:一方面是基本结构,这与事务在内存中是怎样布局的有关;另一方面就是并发。对于并发基本结构很重要,特别是在低层原子操作。所以我将会从基本结构讲起.5.1.1 对象和内存位置在...原创 2019-08-05 20:44:19 · 447 阅读 · 0 评论 -
第二章 线程管理
第二章 线程管理2.1 线程管理基础包含头文件:#include<iostream>#include<thread>一、创建线程:利用入口函数直接创建thread my_thread(my_thread_function);将类作为入口函数class My_thread{public: void operater()() const{ /...原创 2019-07-26 16:56:45 · 164 阅读 · 0 评论 -
第四章 同步并发操作(下)
同步并发操作(下)4.3 限定等待时间4.3.1 时钟4.3.2 时延4.3.3 时间点4.3 限定等待时间之前介绍过的所有阻塞调用,将会阻塞一段不确定的时间,将线程挂起直到等待的事件发生一些情况下要限制一下线程等待的时间发送一些类似“我还存活”的信息,无论是对交互式用户,或是其他进程,亦或当用户放弃等待,你可以按下“取消”键直接终止等待两种超时方式:第一种方式,需要指定一段时间...原创 2019-08-03 20:01:51 · 153 阅读 · 0 评论 -
第四章 同步并发操作(上)
同步并发操作(上)4.1 等待一个事件或其他条件4.1.1 等待条件达成4.1.2 使用条件变量构建线程安全队列4.2 使用期望(future)等待一次性事件4.2.1 带返回值的后台任务4.2.2 任务与期望线程间传递任务4.2.3 使用std::promises单线程处理多接口的实现4.2.4 为“期望”存储“异常”4.2.5 多个线程的等待4.1 等待一个事件或其他条件当一个线程等待另...原创 2019-08-03 15:33:28 · 210 阅读 · 0 评论 -
线程池的实现
为什么要使用线程池? ~~~~~~~ 传统多线程方案中我们采用的服务器模型则是一旦接受到请求之后,即创建一个新的线程,由该线程执行任务。任务执行完毕后,线程退出,这就是是“即时创建,即时销毁”的策略。尽管与创建进程相比,创建线程的时间...转载 2019-09-24 16:49:23 · 140 阅读 · 0 评论