File tree 3 files changed +8
-6
lines changed
3 files changed +8
-6
lines changed Original file line number Diff line number Diff line change @@ -44,7 +44,7 @@ int main(){
44
44
45
45
## 线程管理
46
46
47
- 在 C++ 标准库 中 ,只能管理与 ` std::thread ` 关联的线程,类 ` std::thread ` 的对象就是指代线程的对象,我们说“线程管理”,其实也就是管理 ` std::thread ` 对象。
47
+ 在 C++ 标准库中 ,只能管理与 ` std::thread ` 关联的线程,类 ` std::thread ` 的对象就是指代线程的对象,我们说“线程管理”,其实也就是管理 ` std::thread ` 对象。
48
48
49
49
### 启动新线程
50
50
Original file line number Diff line number Diff line change @@ -51,7 +51,7 @@ int main() {
51
51
52
52
但是我们显然不能寄希望于这种操作系统的调度。
53
53
54
- 而且即使不是一个添加元素,一个删除元素,全是 ` emplace_back ` 添加元素,也一样会有问题,由于 std::vector 不是线程安全的容器,因此当多个线程同时访问并修改 v 时,可能会发生[ 未定义的行为] ( https://zh.cppreference.com/w/cpp/language/memory_model#.E7.BA.BF.E7.A8.8B.E4.B8.8E.E6.95.B0.E6.8D.AE.E7.AB.9E.E4.BA.89 ) 。具体来说,当两个线程同时尝试向 v 中添加元素时,但是 ` emplace_back ` 函数却是可以被打断的,执行了一半,又去执行另一个线程。可能会导致数据竞争,从而引发未定义的结果 。
54
+ 而且即使不是一个添加元素,一个删除元素,全是 ` emplace_back ` 添加元素,也一样会有问题,由于 std::vector 不是线程安全的容器,因此当多个线程同时访问并修改 v 时,可能会发生[ * 未定义的行为* ] ( https://zh.cppreference.com/w/cpp/language/memory_model#.E7.BA.BF.E7.A8.8B.E4.B8.8E.E6.95.B0.E6.8D.AE.E7.AB.9E.E4.BA.89 ) 。具体来说,当两个线程同时尝试向 v 中添加元素时,但是 ` emplace_back ` 函数却是可以被打断的,执行了一半,又去执行另一个线程。可能会导致数据竞争,从而引发 * 未定义 * 的结果 。
55
55
56
56
> 当某个表达式的求值写入某个内存位置,而另一求值读或修改同一内存位置时,称这些** 表达式冲突** 。** 拥有两个冲突的求值的程序就有数据竞争** ,除非
57
57
>
@@ -61,7 +61,7 @@ int main() {
61
61
>
62
62
> ** 如果出现数据竞争,那么程序的行为未定义。**
63
63
64
- 标量类型等都同理,有* 数据竞争* ,未定义行为:
64
+ 标量类型等都同理,有* 数据竞争* ,[ * 未定义行为* ] ( https://zh.cppreference.com/w/cpp/language/memory_model#.E7.BA.BF.E7.A8.8B.E4.B8.8E.E6.95.B0.E6.8D.AE.E7.AB.9E.E4.BA.89 ) :
65
65
66
66
``` cpp
67
67
int cnt = 0 ;
@@ -160,7 +160,7 @@ private:
160
160
161
161
构造函数中初始化这个引用,同时上锁,析构函数中解锁,这是一个非常典型的 `RAII` 式的管理。
162
162
163
- 同时它还提供一个有额外[`adopt_lock_t`](https://zh.cppreference.com/w/cpp/thread/lock_tag_t)参数的构造函数 ,如果使用这个构造函数,则构造不会上锁 。
163
+ 同时它还提供一个有额外[`std:: adopt_lock_t`](https://zh.cppreference.com/w/cpp/thread/lock_tag_t)参数的构造函数 ,如果使用这个构造函数,则构造函数不会上锁 。
164
164
165
165
所以有的时候你可能会看到一些这样的代码:
166
166
@@ -231,14 +231,14 @@ t4.join();
231
231
232
232
---
233
233
234
- C++17 添加了一个新的特性,类模板实参推导, ` std::lock_guard ` 可以根据传入的参数自行推导,而不需要写明模板类型参数:
234
+ C++17 添加了一个新的特性,[ 类模板实参推导] ( https://zh.cppreference.com/w/cpp/language/class_template_argument_deduction ) , ` std::lock_guard ` 可以根据传入的参数自行推导,而不需要写明模板类型参数:
235
235
236
236
``` cpp
237
237
std::mutex m;
238
238
std::lock_guard lc{ m }; // std::lock_guard< std::mutex >
239
239
```
240
240
241
- 并且 C++17 还引入了一个新的“管理类”:[`std::scoped_lock`](https://zh.cppreference.com/w/cpp/thread/scoped_lock),它相较于 `lock_guard`的区别在于,它可以管理多个互斥量。不过对于处理一个互斥量的情况,它和 `lock_guard` 完全相同 。
241
+ 并且 C++17 还引入了一个新的“管理类”:[`std::scoped_lock`](https://zh.cppreference.com/w/cpp/thread/scoped_lock),它相较于 `lock_guard`的区别在于,它可以管理多个互斥量。不过对于处理一个互斥量的情况,它和 `lock_guard` 几乎完全相同 。
242
242
243
243
```cpp
244
244
std::mutex m;
Original file line number Diff line number Diff line change
1
+ # ` st::async ` 与 ` std::future ` 源码解析
2
+
You can’t perform that action at this time.
0 commit comments