Skip to content

Commit d456b4b

Browse files
frederick-vs-jaMq-b
authored andcommitted
避免多次 load 同一个 atomic<shared_ptr>
两次 `load` 结果可能是不同的,这会导致用第一次 `load` 的结果判断没有意义。如果 `data` 可能被修改为空,则 `data.load()->get_value()` 可能造成空指针解引用。
1 parent 31712e4 commit d456b4b

File tree

1 file changed

+3
-3
lines changed

1 file changed

+3
-3
lines changed

md/05内存模型与原子操作.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -493,8 +493,8 @@ void writer() {
493493
494494
void reader() {
495495
for (int i = 0; i < 10; ++i) {
496-
if (data.load()) {
497-
std::cout << "读取线程值: " << data.load()->get_value() << std::endl;
496+
if (auto sp = data.load()) {
497+
std::cout << "读取线程值: " << sp->get_value() << std::endl;
498498
}
499499
else {
500500
std::cout << "没有读取到数据" << std::endl;
@@ -504,7 +504,7 @@ void reader() {
504504
}
505505
```
506506

507-
很显然,这是线程安全的,`store` 是原子操作,而 `data.load()->get_value()` 只是个读取操作。
507+
很显然,这是线程安全的,`store` 是原子操作,而 `sp->get_value()` 只是个读取操作。
508508

509509
我知道,你肯定会想着:*能不能调用 `load()` 成员函数原子地返回底层的 `std::shared_ptr` 再调用 `swap` 成员函数?*
510510

0 commit comments

Comments
 (0)