Skip to content

Commit 54eac6f

Browse files
committed
增加一些补充描述
1 parent 962f4c3 commit 54eac6f

File tree

3 files changed

+8
-6
lines changed

3 files changed

+8
-6
lines changed

md/02使用线程.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ int main(){
4444

4545
## 线程管理
4646

47-
在 C++ 标准库 中,只能管理与 `std::thread` 关联的线程,类 `std::thread` 的对象就是指代线程的对象,我们说“线程管理”,其实也就是管理 `std::thread` 对象。
47+
在 C++ 标准库中,只能管理与 `std::thread` 关联的线程,类 `std::thread` 的对象就是指代线程的对象,我们说“线程管理”,其实也就是管理 `std::thread` 对象。
4848

4949
### 启动新线程
5050

md/03共享数据.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ int main() {
5151

5252
但是我们显然不能寄希望于这种操作系统的调度。
5353

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` 函数却是可以被打断的,执行了一半,又去执行另一个线程。可能会导致数据竞争,从而引发*未定义*的结果
5555

5656
>当某个表达式的求值写入某个内存位置,而另一求值读或修改同一内存位置时,称这些**表达式冲突****拥有两个冲突的求值的程序就有数据竞争**,除非
5757
>
@@ -61,7 +61,7 @@ int main() {
6161
>
6262
>**如果出现数据竞争,那么程序的行为未定义。**
6363
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)
6565

6666
```cpp
6767
int cnt = 0;
@@ -160,7 +160,7 @@ private:
160160
161161
构造函数中初始化这个引用,同时上锁,析构函数中解锁,这是一个非常典型的 `RAII` 式的管理。
162162
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)参数的构造函数 ,如果使用这个构造函数,则构造函数不会上锁
164164
165165
所以有的时候你可能会看到一些这样的代码:
166166
@@ -231,14 +231,14 @@ t4.join();
231231

232232
---
233233

234-
C++17 添加了一个新的特性,类模板实参推导, `std::lock_guard` 可以根据传入的参数自行推导,而不需要写明模板类型参数:
234+
C++17 添加了一个新的特性,[类模板实参推导](https://zh.cppreference.com/w/cpp/language/class_template_argument_deduction)`std::lock_guard` 可以根据传入的参数自行推导,而不需要写明模板类型参数:
235235

236236
```cpp
237237
std::mutex m;
238238
std::lock_guard lc{ m }; // std::lock_guard<std::mutex>
239239
```
240240
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` 几乎完全相同
242242
243243
```cpp
244244
std::mutex m;
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
# `st::async``std::future` 源码解析
2+

0 commit comments

Comments
 (0)