gpt4 book ai didi

multithreading - 线程系统如何处理被不同 CPU 缓存的共享数据?

转载 作者:行者123 更新时间:2023-12-04 02:00:58 25 4
gpt4 key购买 nike

我主要来自 c++ 背景,但我认为这个问题适用于任何语言的线程。这是场景:

  • 我们有两个线程(ThreadA 和 ThreadB),以及共享内存中的值 x
  • 假设对 x 的访问由互斥锁(或其他合适的同步控制)
  • 适当控制。
  • 如果线程碰巧在不同的处理器上运行,如果 ThreadA 执行写操作,但它的处理器将结果放在它的 L2 缓存而不是主内存中,会发生什么?然后,如果 ThreadB 尝试读取该值,它是否不会只查看自己的 L1/L2 缓存/主内存,然后使用那里的任何旧值?

  • 如果情况并非如此,那么如何管理此问题?

    如果是这样,那么可以做些什么呢?

    最佳答案

    你的例子会工作得很好。

    多个处理器使用 coherency protocolMESI以确保数据在缓存之间保持同步。使用 MESI,每条缓存线都被视为已修改、独占、在 CPU 之间共享或无效。写入在处理器之间共享的缓存行会强制它在其他 CPU 中无效,从而保持缓存同步。

    然而,这还不够。不同的处理器有不同的memory models ,并且大多数现代处理器都支持某种级别的重新排序内存访问。在这些情况下,memory barriers需要。

    例如,如果您有线程 A:

    DoWork();
    workDone = true;

    和线程 B:
    while (!workDone) {}
    DoSomethingWithResults()

    由于两者都在不同的处理器上运行,因此无法保证在写入 workDone 和 DoSomethingWithResults() 之前,线程 B 可以看到在 DoWork() 内完成的写入操作可能会出现不一致的状态。内存屏障保证读取和写入的某些顺序 - 在线程 A 中的 DoWork() 之后添加内存屏障将强制所有由 DoWork 完成的读取/写入在写入 workDone 之前完成,以便线程 B 获得一致的 View 。互斥体本质上提供了内存屏障,因此读/写不能通过调用锁定和解锁。

    在您的情况下,一个处理器会向其他处理器发出信号,表明它弄脏了缓存线并强制其他处理器从内存中重新加载。获取互斥量以读取和写入值可确保对内存的更改按预期顺序对其他处理器可见。

    关于multithreading - 线程系统如何处理被不同 CPU 缓存的共享数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1105502/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com