File tree Expand file tree Collapse file tree 1 file changed +5
-5
lines changed Expand file tree Collapse file tree 1 file changed +5
-5
lines changed Original file line number Diff line number Diff line change @@ -24,7 +24,7 @@ void f(){
24
24
25
25
线程 C 到底读取到多少不确定,a 的值是多少也不确定。显然,这构成了数据竞争,出现了[ 未定义行为] ( https://zh.cppreference.com/w/cpp/language/ub ) 。
26
26
27
- 在之前的内容中,我们讲述了使用很多设施 ,如互斥量,来保护共享资源。
27
+ 在之前的内容中,我们讲述了使用很多同步设施 ,如互斥量,来保护共享资源。
28
28
29
29
``` cpp
30
30
std::mutex m;
@@ -34,9 +34,9 @@ void f() {
34
34
}
35
35
```
36
36
37
- 通过互斥量的保护,即使 ` ++a ` 本身不是原子操作,** 逻辑上也可视为原子操作** 。互斥量确保了对共享资源的访问是线程安全的 ,避免了数据竞争问题。
37
+ 通过互斥量的保护,即使 ` ++a ` 本身不是原子操作,** 逻辑上也可视为原子操作** 。互斥量确保了对共享资源的读写是线程安全的 ,避免了数据竞争问题。
38
38
39
- 不过这显然不是我们的重点, C++11 引入了原子类型 [ ` std::atomic ` ] ( https://zh.cppreference.com/w/cpp/atomic/atomic ) ,在下文我们会详细讲解 。
39
+ 不过这显然不是我们的重点。我们想要的是一种 ** 原子类型 ** ,它的所有操作都直接是 ** 原子 ** 的,不需要额外的同步设施进行保护。 C++11 引入了原子类型 [ ` std::atomic ` ] ( https://zh.cppreference.com/w/cpp/atomic/atomic ) ,在下节我们会详细讲解 。
40
40
41
41
## 原子类型 ` std::atomic `
42
42
@@ -50,7 +50,7 @@ void f() {
50
50
std::atomic<int >::is_always_lock_free // true 或 false
51
51
```
52
52
53
- 标准库还提供了一组宏 [ ` ATOMIC_xxx_LOCK_FREE ` ] ( https://zh.cppreference.com/w/cpp/atomic/atomic_is_lock_free ) ,在编译时对各种整形原子类型是否无锁进行判断 。
53
+ 标准库还提供了一组宏 [ ` ATOMIC_xxx_LOCK_FREE ` ] ( https://zh.cppreference.com/w/cpp/atomic/atomic_is_lock_free ) ,在编译时对各种整数原子类型是否无锁进行判断 。
54
54
55
55
``` cpp
56
56
// (C++11 起)
95
95
96
96
> [运行](https:// godbolt.org/z/q5x7Wfd5r)测试。
97
97
98
- 如你所见,我们写了一个简单的示例,展示了使用 C++17 的静态数据成员 `is_always_lock_free` 、以及宏,执行不同的代码 。
98
+ 如你所见,我们写了一个简单的示例,展示了如何使用 C++17 的静态数据成员 `is_always_lock_free` 和预处理宏来让程序执行不同的代码 。
99
99
100
100
因为 `is_always_lock_free` 是编译期常量,所以我们可以使用 C++17 引入的 `constexpr if ` ,它可以在编译阶段进行决策,避免了运行时的判断开销,提高了性能。
101
101
You can’t perform that action at this time.
0 commit comments