operating-system - 为什么 CAS(比较和交换)是原子的?
问题描述
我知道 CAS 是一个众所周知的原子操作。但我很难理解为什么它必须是原子的。以下面的示例代码为例。之后if (*accum == *dest)
,如果另一个线程跳入并成功修改了*dest
第一个线程,则切换回前一个线程并继续进行*dest = newval;
。这不会导致失败吗?
有什么我想念的吗?是否有某种机制可以防止上述情况发生?
任何讨论将不胜感激!
bool compare_and_swap(int *accum, int *dest, int newval)
{
if (*accum == *dest) {
*dest = newval;
return true;
} else {
*accum = *dest;
return false;
}
}
解决方案
人们经常使用非原子的示例代码来描述 CPU 用一条指令原子地做什么;因为更容易看到它是如何工作的(而且因为一条cmpxchg
指令并不能告诉你它是如何工作的)。
您显示的代码就是这样(不是原子的,以帮助理解它是如何工作的)。
推荐阅读
- beautifulsoup - 为什么beautifulsoup 会为这个网页删除这么多东西?
- php - MongoDB 和 PHP 库光标超时
- casting - 类型不匹配:推断类型为 Int 但应为 Byte
- hadoop - YARN Timeline Service v2 无法启动
- javascript - 使用 promise.all 的最佳实践是什么?
- angular - auth0 直接登录后重定向到 http://localhost:4200/null
- typescript - 标记量角器 - Jasmine e2e 执行测试
- android - 如何使用 MutableLiveData 进行数据绑定
和带有 android:enabled 的按钮? - java - 在 NoSuchMethodError 上需要帮助:com.google.common.util.concurrent.MoreExecutors.directExecutor()Ljava/util/concurrent/Executor;在 IntelliJ 中
- java - 是否可以从 Java 代码中获取嵌套表/数组上的元数据?