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/

10-10 13:32