如果条件a = b
成立,我需要以原子方式指定c
,如果条件不成立,则不指定。有没有办法在C / C ++中做到这一点?
澄清:我的意思是原子地"测试和分配"而不是"原子地分配"。
答案 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)
如果c
是a
本身的某个属性,那么比较交换原子操作可以解决您的问题。您在评论中表示情况并非如此。
如果失败,请将c
的所有访问权限(任何读取其状态或修改其状态的内容)和a
包含在公共std::mutex
的锁定中。
测试c
并在a
的锁定中分配给std::mutex
。
如果做错了,请编写一个单线程程序。
如果不这样做,请使用操作系统级别的API暂停您自己的流程中的每个线程,然后测试c
并可能分配给a
。请注意,这可以看到c
或a
处于半写状态(即处于不连续状态),并且线程暂停计划实际上往往不是一种实用的方法除非c
和a
本身都是无锁原子,否则请避免使用它。
请注意,这个计划非常危险和脆弱。
如果做不到这一点,请不那么抽象地描述你的问题并提出另一个问题。可能性较小的问题是解决方案是否合理。