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/

10-11 15:13