8. C++ 并发编程

1Table of Contents

当多个进程或者线程同时访问共享数据时,只要有一个任务会修改数据,那么就可能会发生问题。此时结果依赖于这些任务执行的相对时间,这种场景称为竞争条件(race condition)。访问共享数据的代码片段称之为临界区(critical section)。
具体到上面这个示例,临界区就是读写sum变量的地方。 要避免竞争条件,就需要对临界区进行数据保护。 很自然的,现在我们能够理解发生竞争条件是因为这些线程在同时访问共享数据,其中有些线程的改动没有让其他线程知道,导致其他线程在错误的基础上进行处理,结果自然也就是错误的。 那么,如果一次只让一个线程访问共享数据,访问完了再让其他线程接着访问,这样就可以避免问题的发生了。 接下来介绍的API提供的就是这样的功能:mutex与锁

RAII
上面的几个类(lock_guard,unique_lock,shared_lock,scoped_lock)都使用了一个叫做RAII的编程技巧。 RAII全称是Resource Acquisition Is Initialization,直译过来就是:资源获取即初始化。 RAII是一种C++编程技术,它将必须在使用前请求的资源(例如:分配的堆内存、执行线程、打开的套接字、打开的文件、锁定的互斥体、磁盘空间、数据库连接等——任何存在受限供给中的事物)的生命周期与一个对象的生存周期相绑定。
RAII保证资源可用于任何会访问该对象的函数,它亦保证所有资源在其控制对象的生存期结束时,以获取顺序的逆序释放。类似地,若资源获取失败(构造函数以异常退出),则为已构造完成的对象和基类子对象所获取的所有资源,会以初始化顺序的逆序释放。这有效地利用了语言特性以消除内存泄漏并保证异常安全。

等待事件
内存模型和原子类型
设计基于锁的并发数据结构
无锁数据结构设计
线程划分工作
线程池















comments powered by Disqus