mirror of
https://github.com/CnTransGroup/EffectiveModernCppChinese.git
synced 2025-03-24 08:10:19 +08:00
Update item16.md
This commit is contained in:
parent
e2f975e25e
commit
886f89c888
@ -1,7 +1,7 @@
|
||||
## Item16:让const成员函数线程安全
|
||||
条款16: 让const成员函数线程安全
|
||||
|
||||
如果我们工作在数学领域中,我们就会发现用一个类表示多项式是很方便的。在这个类中,使用一个函数来计算多项式的根是很有用的。即,多项式为零的时候。这样的一个函数它不会更改多项式,因此,它自然被声明为const函数。
|
||||
如果我们在数学领域中工作,我们就会发现用一个类表示多项式是很方便的。在这个类中,使用一个函数来计算多项式的根是很有用的。也就是多项式的值为零的时候。这样的一个函数它不会更改多项式。所以,它自然被声明为const函数。
|
||||
|
||||
```c++
|
||||
class Polynomial {
|
||||
@ -49,7 +49,7 @@ Polynomial p;
|
||||
auto rootsOfp = p.roots(); auto valsGivingZero = p.roots();
|
||||
```
|
||||
|
||||
这些用户代码是非常合理的。`roots`是const 成员函数,那就表示着它是一个读操作。在没有同步的情况下,让多个线程执行读操作是安全的。它最起码应该做到这点。在本例中却没有做到线程安全。因为在`roots`中,这些线程中的一个或两个可能尝试修改成员变量`rootsAreVaild`和`rootVals`。这就意味着在没有同步的情况下,这些代码会有不同的线程读写相同的内存,这就`data race`的定义。这段代码的行为是未定义的。
|
||||
这些用户代码是非常合理的。`roots`是const 成员函数,那就表示着它是一个读操作。在没有同步的情况下,让多个线程执行读操作是安全的。它最起码应该做到这点。在本例中却没有做到线程安全。因为在`roots`中,这些线程中的一个或两个可能尝试修改成员变量`rootsAreVaild`和`rootVals`。这就意味着在没有同步的情况下,这些代码会有不同的线程读写相同的内存,这就是`data race`的定义。这段代码的行为是未定义的。
|
||||
|
||||
问题就是`roots`被声明为const,但不是线程安全的。const声明在c++11和c++98 中都是正确的(检索多项式的根并不会更改多项式的值),因此需要纠正的是线程安全的缺乏。
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user