Skip to content

第三章-在线程间共享数据

回到目录

3.1-线程间共享数据的问题

3.1.2-防止恶性条件竞争

共有三种方法防止恶性条件竞争 - 保护措施包装数据结构 - 无锁编程 - 将修改数据结构当作事务(transaction)来处理

3.2-用互斥保护共享数据

  • std::mutex类和std::lock_guard

3.2.4

std::lock()可以锁住多个锁std::lock(mutex1, mutex2)可以同时对多个互斥量上锁如果互斥量中有一个没锁住,要么是所有互斥量都锁住了要么时所有互斥量一个都没锁住。

RAII使用

std::lock(mtx1, mtx2);
std::lock_guard<std::mutex> lock1(mtx1, std::adopt_lock);
std::lock_guard<std::mutex> lock2(mtx2, std::adopt_lock);

3.3 保护共享数据的其他工具

3.3.1 初始化过程中保护共享数据

  • std::once_flag类和std:: call_once()
  • C++11,保证了静态局部变量不会造成竞争

3.3.2 保护甚少更新的数据结构

3.3.3 递归加锁

std::recursive_mutex,其允许同一线程对某互斥的同一实例多次加锁。我们必须先释放全部的锁,才可以让另一个线程锁住该互斥。 不建议使用递归锁