Skip to content
This repository has been archived by the owner on Feb 29, 2020. It is now read-only.

Commit

Permalink
1. fix #48 on github
Browse files Browse the repository at this point in the history
  • Loading branch information
xiaoweiChen committed Jun 26, 2019
1 parent 67eb30c commit a3503ba
Showing 1 changed file with 4 additions and 4 deletions.
8 changes: 4 additions & 4 deletions content/chapter5/5.2-chinese.md
Original file line number Diff line number Diff line change
Expand Up @@ -260,17 +260,17 @@ p.fetch_add(3,std::memory_order_release);

表5.3 每一个原子类型所能使用的操作

## 5.2.7 原子操作的释放函数
## 5.2.7 原子操作的非成员函数

直到现在,我都还没有去描述成员函数对原子类型操作的形式。但是,在不同的原子类型中也有等价的非成员函数存在。大多数非成员函数的命名与对应成员函数有关,但是需要“atomic_”作为前缀(比如,`std::atomic_load()`)。这些函数都会被不同的原子类型所重载。在指定一个内存序列标签时,他们会分成两种:一种没有标签,另一种将“_explicit”作为后缀,并且需要一个额外的参数,或将内存顺序作为标签,亦或只有标签(例如,`std::atomic_store(&atomic_var,new_value)``std::atomic_store_explicit(&atomic_var,new_value,std::memory_order_release`)。不过,原子对象被成员函数隐式引用,所有释放函数都持有一个指向原子对象的指针(作为第一个参数)。
直到现在,我都还没有去描述成员函数对原子类型操作的形式。但是,在不同的原子类型中也有等价的非成员函数存在。大多数非成员函数的命名与对应成员函数有关,但是需要“atomic_”作为前缀(比如,`std::atomic_load()`)。这些函数都会被不同的原子类型所重载。在指定一个内存序列标签时,他们会分成两种:一种没有标签,另一种将“_explicit”作为后缀,并且需要一个额外的参数,或将内存顺序作为标签,亦或只有标签(例如,`std::atomic_store(&atomic_var,new_value)``std::atomic_store_explicit(&atomic_var,new_value,std::memory_order_release`)。不过,原子对象被成员函数隐式引用,所有非成员函数都持有一个指向原子对象的指针(作为第一个参数)。

例如,`std::atomic_is_lock_free()`只有一种类型(虽然会被其他类型所重载),并且对于同一个对象a,`std::atomic_is_lock_free(&a)`返回值与a.is_lock_free()相同。同样的,`std::atomic_load(&a)`和a.load()的作用一样,但需要注意的是,与a.load(std::memory_order_acquire)等价的操作是`std::atomic_load_explicit(&a, std::memory_order_acquire)`

释放函数的设计是为了要与C语言兼容,在C中只能使用指针,而不能使用引用。例如,compare_exchange_weak()和compare_exchange_strong()成员函数的第一个参数(期望值)是一个引用,而`std::atomic_compare_exchange_weak()`(第一个参数是指向对象的指针)的第二个参数是一个指针。`std::atomic_compare_exchange_weak_explicit()`也需要指定成功和失败的内存序列,而“比较/交换”成员函数都有一个单内存序列形式(默认是`std::memory_order_seq_cst`),重载函数可以分别获取成功和失败内存序列。
非成员函数的设计是为了要与C语言兼容,在C中只能使用指针,而不能使用引用。例如,compare_exchange_weak()和compare_exchange_strong()成员函数的第一个参数(期望值)是一个引用,而`std::atomic_compare_exchange_weak()`(第一个参数是指向对象的指针)的第二个参数是一个指针。`std::atomic_compare_exchange_weak_explicit()`也需要指定成功和失败的内存序列,而“比较/交换”成员函数都有一个单内存序列形式(默认是`std::memory_order_seq_cst`),重载函数可以分别获取成功和失败内存序列。

`std::atomic_flag`的操作是“反潮流”的,在那些操作中它们“标志”的名称为:`std::atomic_flag_test_and_set()``std::atomic_flag_clear()`,但是以“_explicit”为后缀的额外操作也能够指定内存顺序:`std::atomic_flag_test_and_set_explicit()``std::atomic_flag_clear_explicit()`

C++标准库也对在一个原子类型中的`std::shared_ptr<>`智能指针类型提供释放函数。这打破了“只有原子类型,才能提供原子操作”的原则,这里`std::shared_ptr<>`肯定不是原子类型。但是,C++标准委员会感觉对此提供额外的函数是很重要的。可使用的原子操作有:load, store, exchange和compare/exchange,这些操作重载了标准原子类型的操作,并且获取一个`std::shared_ptr<>*`作为第一个参数:
C++标准库也对在一个原子类型中的`std::shared_ptr<>`智能指针类型提供非成员函数。这打破了“只有原子类型,才能提供原子操作”的原则,这里`std::shared_ptr<>`肯定不是原子类型。但是,C++标准委员会感觉对此提供额外的函数是很重要的。可使用的原子操作有:load, store, exchange和compare/exchange,这些操作重载了标准原子类型的操作,并且获取一个`std::shared_ptr<>*`作为第一个参数:

```
std::shared_ptr<my_data> p;
Expand Down

0 comments on commit a3503ba

Please sign in to comment.