C++并发编程实战
作为对《C++ Concurrency in Action》 的中文翻译。
本书是基于C++11新标准的并发和多线程编程深度指南。
从std::thread、std::mutex、std::future和std::async等基础类的使用,到内存模型和原子操
作、基于锁和无锁数据
扮猪吃饺子
努力的人,运气不会太差。
展开
-
4.4 使用同步操作简化代码(C++并发编程实战)
4.4.1 使用期望的函数化编程术语函数化编程(functional programming)引用于一种编程方式,这种方式中的函数结果只依赖于传入函数的参数,并不依赖外部状态。函数化编程的好处,并不限于那些将纯粹作为默认方式的语言。C++是一个多范型的语言。在C++11中这种方式要比C++98简单许多,因为C++11支持lambda表达式,还加入了boost和TR1中的std::bind,...原创 2019-06-26 07:50:27 · 277 阅读 · 0 评论 -
4.3 限定等待时间(C++并发编程实战)
两种指定的超时方式:一种是时延的超时方式——需要指定一段时间(例如30毫秒);第二种是绝对超时方式——指定一个时间点(例如:协调时间[UTC]17:30:15.045987023,2011年11月30号)。多数等待函数提供变量,对两种超时方式进行处理。处理持续时间的变量以_for作为后缀,处理绝对时间的变量以_until作为后缀。4.3.1 时钟对于C++标准库来说,时钟就是时间信息源。特...原创 2019-06-23 10:50:19 · 1071 阅读 · 0 评论 -
4.2 使用期望等待一次性事件(C++并发编程实战)
期望(future):当一个线程需要等待一个特定的一次性事件,在某种程度上来说它就需要知道这个时间的未来表现形式。之后,这个线程会周期性(较短的)的等待和检查,事件是否触发;在检查期间也会执行其他的任务。另外,在等待期间它可以先执行另外一些任务,知道对应的任务触发,而后等待期望的状态会变为就绪(ready)。一个期望可能是数据相关,也可能不是。当事件发生(并且期望状态就绪),这个期望就不能被重置。...原创 2019-06-21 08:05:46 · 428 阅读 · 0 评论 -
第4章:同步并发操作(C++并发编程实战)
4.1.1等待条件达成C++标准对条件变量有两套实现:std::condition_variable和std::condition_variable_any。包含在<condition_variable>头文件声明中。两者都需要与一个互斥量一起才能工作;前者仅限于std::mutex一起工作,而后者可以和任何满足最低标准的互斥量一起工作,从而加上了_any后缀。因为std::con...原创 2019-06-18 08:07:26 · 330 阅读 · 0 评论 -
3.3 保护共享数据的替代设施(C++并发编程实战)
3.3.1 保护共享数据的初始化过程互斥量是最通用的机制,但其并非保护共享数据的唯一方式。这里有许多替代方案可以在特定的情况下,提供更合适的保护。延迟初始化在单线程中很常见——每一个操作都需要先对源进行检查,为了了解数据是否被初始化,然后再其使用前决定,数据是否需要初始化:std::shared_ptr<some_resource> resource_ptr;void ...原创 2019-06-16 09:50:32 · 176 阅读 · 0 评论 -
第3章:线程间共享数据(C++并发编程实战)
3.2使用互斥量保护共享数据C++通过实例化std::mutex创建互斥量,通过调用成员函数lock()/unlock()来进行加解锁。不过不推荐直接调用成员函数,因为必须记住在每一个函数的出口都要调用unlock(),包括异常。C++标准库提供了一个RAII的模板类std::lock_guard,其会在构造函数的提供已加锁的互斥量,并在析构函数的时候进行解锁,从而保证一个已锁的互斥量总会被正...原创 2019-06-13 07:12:05 · 488 阅读 · 0 评论 -
2.5识别线程(C++并发编程实战)
线程的标识类型是std::thread::id,可以通过两种方式进行检索。第一:可以通过std::thread对象的成员函数get_id()进行直接获取,如果std::thread对象没有和任何线程相关,get_id()将返回std::thread::type默认构造函数,这个值表示“没有线程”。第二:当前线程中调用std::this_thread::get_id()也可以获取线程标识。std...原创 2019-06-05 07:22:13 · 330 阅读 · 0 评论 -
2.4运行时决定线程数量(C++并发编程实战)
std::thread::hardware_concurrency()这个函数将返回同时并发在一个程序中的数量。在多核系统中,返回值可以是CPU核心的数量,返回值也仅仅是一个提示,当系统无法获取时,函数返回0。如下实现了一个并行版的std::accumulate:代码中将整体工作拆分成小任务交给每个线程去做,并设置最小的数,是为了避免太多的线程。在操作数为0的时候抛异常:templat...原创 2019-06-04 07:56:34 · 770 阅读 · 0 评论 -
2.3转移线程的所有权(C++并发编程实战)
C++标准库中很多资源占有(resource-owning)类型,比如std::ifstream,std::unique_ptr还有std::thread都可以移动,但不可以拷贝std::thread支持移动,这意味着线程的所有权可以在函数外移动,就如下面程序一样:std::thread f(){ void some_function(); return std::thread(s...原创 2019-06-03 07:42:08 · 246 阅读 · 0 评论 -
2.2向线程函数传递参数(C++并发编程实战)
向std::thread构造函数中可调用对象或函数传递一个参数很简单,需要注意的是:默认参数要拷贝到线程独立内存中,即使参数是引用的形式void f(int i,std::string const& s);std::thread t(f,3,"hello");函数第二个参数需要进行隐式转换。当指向动态变量的指针作为参数传递给线程的情况:void f(int i,std...原创 2019-06-02 09:53:57 · 440 阅读 · 0 评论 -
第2章:线程管理(C++并发编程实战)
2.1线程管理的基础2.1.1启动线程使用C++线程库启动线程,可以归纳为构造std::thread对象:void do_some_work();std::thread my_thread(do_some_work);为了让编译器识别std::thread类,这个简单的例子也要包括<thread>头文件。如同大多数C++标准库一样,std::thread可以调用类型...原创 2019-06-01 14:10:20 · 225 阅读 · 0 评论 -
第1章:你好,C++并发世界(C++并发编程实战)
1.4.1 你好,并发世界如下一个简单的hello ,Concurrent World程序:#include <iostream>#include <thread> //1void hello() //2{ std::cout << "Hello Concurrent World\n";}int main(){ std::th...原创 2019-06-01 09:36:41 · 342 阅读 · 0 评论