【问题标题】:Are acquire/release semantics really enough for implementing critical sections?获取/释放语义真的足以实现关键部分吗?
【发布时间】:2019-04-06 12:46:49
【问题描述】:

(这里,临界区,我的意思是任何同步机制,防止并发访问某些资源。)

似乎网络上的共识是,您只需要在进入临界区时获取语义,并在离开时释放语义。但这不是打开了僵局的可能吗?

这里有一些伪代码来解释我的意思。这是原始代码:

Thread 1:
    enter A // acquire semantics
    // ... some work within A
    leave A // release semantics

    enter B // acquire semantics
    // ... some work within B
    leave B // release semantics

Thread 2:
    enter B // acquire semantics
    // ... some work within B
    leave B // release semantics

    enter A // acquire semantics
    // ... some work within A
    leave A // release semantics

当执行这段代码时,CPU 可以合法地将它转换成这个(acquis 之前没有任何移动,releases 之后没有任何移动):

Thread 1:
    enter A // acquire semantics
    enter B // acquire semantics
    // ... some work within A
    // ... some work within B
    leave A // release semantics
    leave B // release semantics

Thread 2:
    enter B // acquire semantics
    enter A // acquire semantics
    // ... some work within B
    // ... some work within A
    leave B // release semantics
    leave A // release semantics

但是现在,我们遇到了以前没有的死锁危险!两个线程进入多个临界区,但顺序不同。

那么关键部分是否也不需要防止存储/加载重新排序? IE。他们不需要顺序一致的语义而不仅仅是获取/释放吗?为什么不指定这个

【问题讨论】:

    标签: multithreading locking mutex deadlock memory-barriers


    【解决方案1】:

    获取/释放的“移动”解释是一个有用的指南,但可能会分解,因为它描述了一个线程如何看待其他线程的操作。每个线程必须看到自己的动作按顺序发生。例如,线程 2 可以看到这个序列:

    1. 线程 1 获取 A
    2. 线程 2 获取 B

    但随后线程 2 将在获取 A 之前将其视为释放 B。相反,在同一运行期间,线程 1 可以将其视为:

    1. 线程 2 获取 B
    2. 线程 1 获取 A

    但随后线程 1 会认为自己在获得 B 之前释放了 A。

    【讨论】:

    • 这是否意味着处理器被禁止重新排序指令,即使它不会改变单线程程序的最终结果?因为否则,为什么线程 1 总是认为自己在获取 B 之前释放了 A?这是否意味着内存排序问题只影响本地缓存传播到共享内存的顺序,而不影响指令本身的顺序?显然,我不是专家,我只是想更好地了解一般内存重新排序的可能性和可能性。
    • 处理器必须看到自己的指令按顺序执行。它可能会看到其他处理器的指令发生乱序,并且两个处理器可能在其指令发生的总顺序上存在分歧。 IE。使用单一的全局指令顺序进行推理是不安全的。
    • 那么我能弄清楚处理器如何处理乱序执行的唯一方法是使用一种队列:一旦获得第一个锁,它就会将第二个锁排入队列,但它也将第一个锁所需的其余工作排入队列。因此,如果获取第二个锁失败,它会将其推回队列的末尾,但还有其他事情要做。这最终将释放第一个锁。这种解释在正确的轨道上吗?基本上,执行顺序不是静态的,而是根据情况动态变化的?
    • 大多数处理器不会尝试乱序获取锁,因为“撤消”方面很棘手。但是,在某些英特尔处理器中实现了一种称为“推测锁省略”的东西,它具有“撤消”逻辑。见en.wikipedia.org/wiki/Transactional_Synchronization_Extensions
    猜你喜欢
    • 2011-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-23
    • 2020-06-22
    • 1970-01-01
    相关资源
    最近更新 更多