介绍与引入
这是阅读C++ Concurrency in Action 2rd edition的笔记,本文关注C++中的数据共享问题。首先需要明确的一点是,数据共享问题的来源在于写操作。如果所有的线程都只读,那么就不会有资源冲突的问题。
使用互斥量 Protecting shared data with mutexes
在C++中,可以通过构造一个std::mutex
的互斥量实例来创建互斥锁,通过lock()
和unlock
上锁与解锁。但是这种方法并不推荐,因为每次上锁都要伴随着一次解锁,即便是代码出现异常。为了简化流程并保证每次锁都能被正常释放,C++标准库为互斥量提供了RAII模版类std::lock_guard
,该类在构造函数时上锁,在析构函数时解锁,如此便保证了锁能够被安全地释放。
下面是一段通过互斥量对链表访问与修改的示例代码。通过some_mutex
对函数体上锁,保证两个函数中对于数据some_list
的访问是互斥的。
#include <list>
#include <mutex>
#include <algorithm>
std::list<int> some_list;
std::mutex some_mutex;
void add_to_list(int new_value) {
std::lock_guard<std::mutex> guard(some_mutex);
some_list.push_back(new_value);
}
bool list_contains(int value_to_find) {
std::l