如果条件在C / C ++中成立,如何以原子方式设置值?

时间:2016-11-09 09:05:47

标签: c++ c++11 atomic compare-and-swap

如果条件a = b成立,我需要以原子方式指定c,如果条件不成立,则不指定。有没有办法在C / C ++中做到这一点?

澄清:我的意思是原子地"测试和分配"而不是"原子地分配"。

2 个答案:

答案 0 :(得分:9)

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

std::atomic<int> value;
...
int expected = 9;
bool result = std::atomic_compare_exchange_strong(&value, &expected, 10);

仅当条件value成立时,value == 9才设置为10,整个操作都是原子操作。

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

答案 1 :(得分:1)

如果ca本身的某个属性,那么比较交换原子操作可以解决您的问题。您在评论中表示情况并非如此。

如果失败,请将c的所有访问权限(任何读取其状态或修改其状态的内容)和a包含在公共std::mutex的锁定中。

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

如果做错了,请编写一个单线程程序。

如果不这样做,请使用操作系统级别的API暂停您自己的流程中的每个线程,然后测试c并可能分配给a。请注意,这可以看到ca处于半写状态(即处于不连续状态),并且线程暂停计划实际上往往不是一种实用的方法除非ca本身都是无锁原子,否则请避免使用它。

请注意,这个计划非常危险和脆弱。

如果做不到这一点,请不那么抽象地描述你的问题并提出另一个问题。可能性较小的问题是解决方案是否合理。

相关问题