C++ 如果条件在C/C+中成立,如何自动设置值+;?

C++ 如果条件在C/C+中成立,如何自动设置值+;?,c++,c++11,atomic,compare-and-swap,C++,C++11,Atomic,Compare And Swap,如果条件c成立,我需要自动分配a=b,如果条件不成立,则不分配。在C/C++中有这样做的方法吗 澄清:我的意思是原子地“测试并分配”,而不是“原子地分配”。没有一个操作可以完成您通常需要的操作。if涉及的常见情况是,您的条件c测试a是否已设置为某个特定值。在这种情况下,您需要的操作是比较和交换,例如: std::atomic<int> value; ... int expected = 9; bool result = std::atomic_compare_exchange_str

如果条件
c
成立,我需要自动分配
a=b
,如果条件不成立,则不分配。在C/C++中有这样做的方法吗


澄清:我的意思是原子地“测试并分配”,而不是“原子地分配”。

没有一个操作可以完成您通常需要的操作。if涉及的常见情况是,您的条件
c
测试
a
是否已设置为某个特定值。在这种情况下,您需要的操作是比较和交换,例如:

std::atomic<int> value;
...
int expected = 9;
bool result = std::atomic_compare_exchange_strong(&value, &expected, 10);
std::原子值;
...
int预期=9;
bool result=std::原子比较交换强(&value,&expected,10);
这里,只有当条件
value==9
为真时,才将
value
设置为10,整个操作是原子的


如果您的条件不是这种形式,那么您必须使用互斥体(或其他一些多操作机制)来实现原子性。

如果
c
a
本身的一些属性,那么比较exchange原子操作可以解决您的问题。您在评论中表示情况并非如此

否则,将
c
(任何读取其状态或修改其状态的内容)和
a
的所有访问都封装在公共
std::mutex
的锁中

测试
c
并在
std::mutex
的锁中分配给
a

否则,编写一个单线程程序

如果做不到这一点,请使用操作系统级API挂起进程中除您自己之外的每个线程,然后测试
c
,并可能分配给
a
。请注意,这可能会看到
c
a
处于半写状态(即,处于不一致状态),而对于线程挂起计划,实际上往往没有实际的方法来避免它,除非
c
a
本身都是无锁原子的

请注意,该计划极其危险和脆弱


如果做不到这一点,就不要那么抽象地描述你的问题,再问另一个问题。可能性较小,你的问题的抽象版会有合理的解决方案。< /P> C还是C++?那些是非常不同的语言!尤其是在原子方面。条件
c
是否取决于
a
的当前值?(由于使用了
比较和交换标记,因此询问)定义“原子”。在什么情况下?原子分配还是原子测试分配?它说的是“原子分配”,但你也可以认为它是“原子分配(如果条件c成立,则分配a=b)”。不要走得太远。找到一个自旋锁实现并使用它