c# - 比较和交换有什么用?

标签 c# c assembly thread-safety compare-and-swap

我最近在读关于 Compare And Swap 的文章原子操作(CMPXCHG、.NET 的 Interlocked.CompareExchange 等)。

我了解它在内部是如何工作的,以及它是如何从客户那里使用的。

我不太明白的是什么时候有人会使用 CAS?

维基百科说:

CAS is used for implementing synchronization primitives like semaphores and mutexes, likewise more sophisticated lock-free and wait-free algorithms.

那么,谁能给我一个更通用的真实世界用例,其中包含代码和 CAS 使用说明?

这个问题与语言无关,所以任何语言都可以(首选基于 C 或 x86 汇编)。

谢谢!

最佳答案

通过示例很容易看出这一点。假设我们想以原子方式并发地对共享变量进行一些设置:

int shared = 0;

void Set(int index) {
 while (true) {
  if (Interlocked.CompareExchange<int>(ref shared, shared | (1 << index), shared) == shared)
   break; //success
 }
}

如果我们看到“旧值”(即返回值)同时发生变化,我们就会检测到失败。

如果这没有发生,我们就没有并发修改,所以我们自己的修改成功完成。

您可以使用这种技术实现非常复杂的东西。不过,旋转越复杂,性能损失就越大。

我想强调的是,CAS 的一个关键属性是它可能会失败,并且可以可靠地检测到失败。

关于c# - 比较和交换有什么用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10294229/

相关文章:

c - 使用系统调用执行c程序

c - 如何在没有visual studio的情况下编译C文件

winapi - 汇编器 : Getting Win32's WinMain on-stack parameters

assembly - EDI 和 ESI 寄存器的角色切换

c# - EF 的西里尔字母问题

c# - 如何在 C# 中更改字符串路径的扩展名?

c - intmax_t 文字的后缀

assembly - LC3 汇编按位右移

c# - 赋值的左侧必须是变量

c# - 使用 JSON.NET 和 NodaTime 从 JSON 反序列化 LocalTime 导致 NodaTime.Text.UnparsableValueException