gpt4 book ai didi

c++ - 使用 CompareAndSwap 的 AtomicIncrement

转载 作者:行者123 更新时间:2023-11-28 05:13:27 27 4
gpt4 key购买 nike

不是作业,是为了考试而学习。

我对问题陈述的最佳尝试:

假设一个线程调用 AtomicIncrement,传递一个指向共享整型变量的指针。没有指定另一个线程是否会修改这个变量,但这是可能的。这种比较和交换的实现在成功交换时返回 1,在失败时返回 0(旧!= 值)

void AtomicIncrement(int *value, int amount) { 
do { int old = *value; } // save old value
while (CompareAndSwap(value, old, old + amount) == 0);
}

问题:

我不太明白这里发生了什么。

代码执行“int old = *value;”的原因是因为另一个线程可以在 do {} 和 while 条件检查之间更改 (*value) 吗?

My textbook (page 10)说“反复尝试将值更新为新数量”,但我看不出 *value 怎么可能是调用线程传递给 AtomicIncrement() 的原始值以外的任何东西,我一定是遗漏了一些东西。混淆来自于这样一个事实,即 CompareAndSwap 应该是一个原子指令,因此在“调用”CompareAndSwap 期间没有机会更改 *value。

最佳答案

如果没有临时变量或循环,您将运行 CompareAndSwap(value, *value, *value + amount)。这不是原子的。有一个 sequence point在评估函数的参数(评估每个参数之间没有确定的顺序)和函数调用本身之间。

此函数必须加载 *value 以作为参数传递给 CompareAndSwap。它还必须加载 *value 以便在表达式 *value + account 中使用,也可以作为参数传递。

问题 1. 在该线程加载 *value 和调用 CompareAndSwap 之间,*value 可能已被另一个更改线。这就是为什么循环是必要的。

问题 2。不能保证编译器只发出一个 *value 负载。加载一次 *value 并将 amount 添加到本地拷贝是合法的,但加载 * 也是合法的value 两次,一次用于第二个参数,一次用于第三个参数。如果发生这种情况,另一个线程可能在这些加载之间更改了 *value。这就是使用临时变量的原因,尽管这实际上仍然不能保证没有 memory barrier 的单次加载。 .

关于c++ - 使用 CompareAndSwap 的 AtomicIncrement,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43121985/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com