gpt4 book ai didi

c++ - C++ IntAtomicGet、GotW 的原因

转载 作者:搜寻专家 更新时间:2023-10-31 02:19:57 27 4
gpt4 key购买 nike

GotW article #45 , Herb 声明如下:

void String::AboutToModify(
size_t n,
bool bMarkUnshareable /* = false */
) {
if( data_->refs > 1 && data_->refs != Unshareable ) {
/* ... etc. ... */

This if-condition is not thread-safe. For one thing, evaluating even "data_->refs > 1" may not be atomic; if so, it's possible that if thread 1 tries to evaluate "data_->refs > 1" while thread 2 is updating the value of refs, the value read from data_->refs might be anything -- 1, 2, or even something that's neither the original value nor the new value.

此外,他指出 data_->refs 可以在与 1 比较和与 Unshareable 比较之间进行修改。

再往下,我们找到解决方案:

void String::AboutToModify(
size_t n,
bool bMarkUnshareable /* = false */
) {
int refs = IntAtomicGet( data_->refs );
if( refs > 1 && refs != Unshareable ) {
/* ... etc. ...*/

现在,我知道相同的引用用于两次比较,解决了问题 2。但是为什么是 IntAtomicGet?我在关于该主题的搜索中没有找到任何结果——所有原子操作都集中在读取、修改、写入操作上,这里我们只进行读取。那么我们可以做...

int refs = data_->refs;

...最终哪条指令应该只是一条指令?

最佳答案

不同的平台对读/写操作的原子性做出不同的 promise 。例如,x86 保证读取一个双字(4 字节)将是一个原子操作。但是,您不能假设这对任何架构都是正确的,而且很可能不会。

如果您计划为不同的平台移植您的代码,这样的假设可能会给您带来麻烦并导致您的代码中出现奇怪竞争条件。因此,最好保护自己并使读/写操作显式原子化。

关于c++ - C++ IntAtomicGet、GotW 的原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33246133/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com