线程除了创建和销毁外,还需要控制其暂停、继续运行等状态。
C++ concurrency:设计可以并发操作的代码
比起设计可并发访问的数据结构,现在需要站在更高的层次来看待并发。
C++ concurrency:设计基于锁的可以并发操作的数据结构
除了用户主动使用互斥锁来保护共享数据,也可以在设计共享数据结构的时候让其可以被并发的访问。
这样子的数据结构对用户就相对更加的友好,对于用户来说它就是多线程安全的。
但不管怎么说,这种数据结构在被并发访问的时候,其实是将多个线程的访问进行了串行化。那么就需要将互斥的区间设计的越小越好,以达到尽量高的并发性。
C++ concurrency:线程间同步
熟悉用 c++ 来编写可以跨平台的数据同步操作。
C++ concurrency:线程间共享数据
避免data race
的底层方法有 3 种:
- 使用互斥机制,保证访问共享数据的原子性
- 使用无锁编程
- 使用事务机制(如同数据库一样,将多个操作做成日志形式,一旦日志被打断则重新开始)
而互斥机制是相对简单易用的方式。
C++ concurrency:线程管理
理解 c++ 对线程的管理。
C++ concurrency:初识并发
c++ 对于多线程的支持是在 c++11 出现的,这表示可以编写跨平台的多线程代码了。
Effective C++ :考虑用 emplacement 替代 insertion
对容器的 insertion 操作,比如 push_back
,有的时候效率并不高。
Effective C++ :如果拷贝和移动的负担很小,那么考虑使用拷贝
为了兼顾性能和功能性,有些类会提供拷贝和移动两个版本:
1 | class Widget { |
使用完美转发来实现一个简易版本:
1 | class Widget { |
但通用引用可以接收各种类型的参数,这在传入错误的参数时,编译器的报错信息会异常繁琐。其实还有更好的选择。
Effective C++ :正确使用 lambda
lambda 使得 c++ 更有魅力,使用 lambda 可以创建一个可调用的对象,一般用于以下场合:
- 快速创建一个简短的函数,仅在父函数中使用,避免繁琐的创建成员函数的过程。
- 为标准库的算法(
std::find_if,std::sort
等),优雅的创建一个可调用对象。 - 快速为标准库创建删除器,比如
std::unique_ptr,std::shared_ptr
等