book: revise usage of "mutex" and "instantiation" (#292)

This commit is contained in:
A. Jiang
2024-06-01 18:10:55 +08:00
committed by GitHub
parent 7b57e5e5a1
commit 01b64d415e
2 changed files with 7 additions and 8 deletions

View File

@@ -31,7 +31,7 @@ int main() {
我们在操作系统、亦或是数据库的相关知识中已经了解过了有关并发技术的基本知识,`mutex` 就是其中的核心之一。
C++11 引入了 `mutex` 相关的类,其所有相关的函数都放在 `<mutex>` 头文件中。
`std::mutex` 是 C++11 中最基本的 `mutex` 类,通过实例化 `std::mutex` 可以创建互斥量,
`std::mutex` 是 C++11 中最基本的互斥量类,可以通过构造 `std::mutex` 对象创建互斥量,
而通过其成员函数 `lock()` 可以进行上锁,`unlock()` 可以进行解锁。
但是在实际编写代码的过程中,最好不去直接调用成员函数,
因为调用成员函数就需要在每个临界区的出口处调用 `unlock()`,当然,还包括异常。
@@ -163,7 +163,7 @@ int main() {
条件变量 `std::condition_variable` 是为了解决死锁而生,当互斥操作不够用而引入的。
比如,线程可能需要等待某个条件为真才能继续执行,
而一个忙等待循环中可能会导致所有其他线程都无法进入临界区使得条件为真时,就会发生死锁。
所以,`condition_variable` 实例被创建出现主要就是用于唤醒等待线程从而避免死锁。
所以,`condition_variable` 对象被创建出现主要就是用于唤醒等待线程从而避免死锁。
`std::condition_variable``notify_one()` 用于唤醒一个线程;
`notify_all()` 则是通知所有线程。下面是一个生产者和消费者模型的例子:
@@ -283,8 +283,7 @@ int main() {
这对于一个仅需原子级操作(没有中间态)的变量,似乎太苛刻了。
关于同步条件的研究有着非常久远的历史,我们在这里不进行赘述。读者应该明白,现代 CPU 体系结构提供了 CPU 指令级的原子操作,
因此在 C++11 中多线程下共享变量的读写这一问题上,还引入了 `std::atomic` 模板,使得我们实例化一个原子类型,将一个
原子类型读写操作从一组指令,最小化到单个 CPU 指令。例如:
因此在多线程下共享变量的读写这一问题上, C++11 中还引入了 `std::atomic` 模板,使得我们实例化原子类型,将一个原子写操作从一组指令,最小化到单个 CPU 指令。例如:
```cpp
std::atomic<int> counter;