CMPXCHG语句的工作方式如下:
CMPXCHG (common, old, new):
int temp
temp <- common
if common = old then
common <- new
return temp
什么是最简单的算法来实现
关键部分,如果有CMPXCHG原子指令可用?
最佳答案
如果要创建一个简单的关键部分(使用Windows definition of a CRITICAL_SECTION
),则可以查看以下pseduo代码:
EnterCS(cs):
If CMPXCHG(cs,0,1) = 0
Return True
Return False
ExitCS:
If CMPXCHG(cs,1,0) = 1
Return True
Return False
然后使用它成为以下简单情况:
If EnterCS(cs)
SomeValue <- SomeValue + 10
ExitCS(cs)
实际上,这种获取更像是一种尝试获取,以扩展到CS的更常见的获取方案,我们改变了这样的方法
EnterCS(cs):
While CMPXCHG(cs,0,1) != 0
SpinOneCycle()
Return True
这种简单的锁具有各种问题,例如无法处理递归,您需要为此保留递归锁计数。我建议使用操作系统提供的内容。如果您确实需要编写自己的锁,
英特尔有几本关于编写高性能和可扩展自旋锁的出版物,您可以阅读其中一种用于Xeon处理器here,而另一本则用于x86 here。 Lockless Inc也有一篇关于自旋锁here的文章。
关于c - CMPXCHG和关键部分实现,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50280311/