在GotW article #45中,Herb声明以下内容:
void String::AboutToModify(
size_t n,
bool bMarkUnshareable /* = false */
) {
if( data_->refs > 1 && data_->refs != Unshareable ) {
/* ... etc. ... */
另外,他指出data _-> refs可以在与1比较和与Unshareable比较之间进行修改。
再往下看,我们找到一个解决方案:
void String::AboutToModify(
size_t n,
bool bMarkUnshareable /* = false */
) {
int refs = IntAtomicGet( data_->refs );
if( refs > 1 && refs != Unshareable ) {
/* ... etc. ...*/
现在,我知道两个比较都使用相同的ref,从而解决了问题2。但是为什么要使用IntAtomicGet?在该主题的搜索中,我没有发现任何问题-所有原子操作都集中在读取,修改,写入操作上,在这里我们只读取了一个。那我们可以做...
int refs = data_->refs;
...这到底应该只是一条指令?
最佳答案
不同的平台对读/写操作的原子性做出不同的 promise 。例如,x86
保证读取双字(4 bytes
)将是原子操作。但是,您不能假设这对于任何体系结构都是正确的,并且可能并非如此。
如果您打算将代码移植到不同的平台,那么这样的假设可能会给您带来麻烦,并导致代码中出现奇怪的竞争状况。因此,最好保护自己,并使读/写操作明确地原子化。
关于c++ - C++ IntAtomicGet,GotW的原因,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33246133/