Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 非破坏性原子弹?_C++_Multithreading_Atomic - Fatal编程技术网

C++ 非破坏性原子弹?

C++ 非破坏性原子弹?,c++,multithreading,atomic,C++,Multithreading,Atomic,如果我有这样一个原子变量: #include <atomic> std::atomic<int> a = 5; 我在原子fetch\u和

如果我有这样一个原子变量:

#include <atomic>

std::atomic<int> a = 5;
我在原子
fetch\u和
++
上做了一个快速测试,之后它们似乎都增加了变量
a
的值。有没有一种方法可以在不产生永久结果的情况下,以原子方式递增测试

if(a + 4 < another_variable) // ...
然后,
a
的并发更改是否及时到达以更改测试结果仍然未知。在同步方面,您没有获得任何额外的保证

如果这是您的程序的问题,则表明您需要更强大的同步机制。一个std::mutex
可能是一个好的开始

然后,
a
的并发更改是否及时到达以更改测试结果仍然未知。在同步方面,您没有获得任何额外的保证

如果这是您的程序的问题,则表明您需要更强大的同步机制。可能std::mutex是一个好的开始。

您可以执行以下操作:

if (a + 4 < another_variable) { ... 
效果:
load()

返回:加载()的结果

它们都不能修改
a

您只需执行以下操作:

if (a + 4 < another_variable) { ... 
效果:
load()

返回:加载()的结果


它们都不能修改
a

另一个_变量-=4
?如果此线程外没有可见的副作用,那么什么需要原子化?原子与什么有关?仅仅是
a+4
有什么不对?谈论各种非破坏性操作的原子性没有多大意义。您需要一个原子加载指令。问题是,究竟应该以原子方式加载什么?只有a,或者a和b分开,或者a和b一起作为一个单元?后一种情况很棘手,但不清楚为什么需要另一个变量-=4?如果在这个线程之外没有可见的副作用,那么什么需要原子化?原子与什么有关?仅仅是
a+4
有什么不对?谈论各种非破坏性操作的原子性没有多大意义。您需要一个原子加载指令。问题是,究竟应该以原子方式加载什么?只有a,或者a和b分开,或者a和b一起作为一个单元?后一种情况很棘手,但不清楚为什么需要。std::atomic::operator T()相当于std::atomic::load(),因此
如果(a+4<另一个变量)
像.load()一样使用原子负载。@JayMiller很好。我个人有编写
load()
s的习惯,这样我可以在我自己的代码中更快地识别原子,但当然,为了更好的可读性,您的版本可能更可取。这取决于您是为“Achtung!atomics!”还是“嘿,这只是一个数字,现在不要为原子担心。”这可能因使用而异。std::atomic::operator T()相当于std::atomic::load(),因此
如果(a+4<另一个变量)
使用原子负载,就像a.load()一样。@JayMiller很好。我个人有编写
load()
s的习惯,这样我可以在我自己的代码中更快地识别原子,但当然,为了更好的可读性,您的版本可能更可取。这取决于您是为“Achtung!atomics!”还是“嘿,这只是一个数字,现在不要为原子担心。”这可能因使用不同而有所不同。
 if(a.plus4IsLessThan(another_variable) // ...
if (a + 4 < another_variable) { ... 
if (a.load() + 4 < another_variable) { ...
A::operator C() const volatile noexcept;
A::operator C() const noexcept;