【问题标题】:Parallelism and Synchronization并行与同步
【发布时间】:2010-10-10 10:53:21
【问题描述】:

假设您正在多核系统中使用并行。

难道不完全有可能同时执行相同的指令吗?

取以下代码:

int i = 0;

if( blockingCondition )
{
  lock( objLock )
  {
    i++;
  }
}

在我的脑海中,似乎很有可能在具有多核和并行性的系统上,blockingCondition 可以在同一时刻被检查,从而导致在同一时刻尝试锁定,等等。 .这是真的吗?

如果是这样,您如何确保跨处理器同步?

另外,.net TPL 是否处理这种类型的同步?其他语言呢?

编辑 请注意,这不是关于线程,而是关于任务和并行处理。

编辑 2 好的,谢谢大家的信息。那么操作系统是否会确保写入内存是序列化的,通过易失性读取确保多核同步?

【问题讨论】:

    标签: c# java .net parallel-processing task-parallel-library


    【解决方案1】:

    要了解为什么会这样,请记住:

    1. 锁定一个锁(即递增一个 对象上的锁定信号量)是 如果对象阻塞的操作 已锁定。

    2. lock的两个步骤,a)检查锁 信号量是免费的,b) 实际上 锁定对象,执行 '同时' - 即他们是 整体或原子操作为 CPU和CPU之间的关系 内存问题。

    因此,您可以看到,如果有两个线程进入您的if-block,则两个线程中的一个将获取锁,另一个将阻塞,直到第一个线程完成if

    【讨论】:

    • @miguel,你能描述一下线程和并行的区别吗?
    • 我想我的意思是我的问题是关于并行核心上的任务,而不是单个核心上的线程
    • @miguel:您的 OS+Framework+Library 旨在使单核/多核区别尽可能不可见。
    • 对于大多数架构 (ccNUMA) 上的单核、多核或多 CPU,此答案是正确的。锁定的“原子”性质实际上是跨所有内核完成的。
    【解决方案2】:

    您在此处描述的锁是 objLock 上的“Monitor”样式锁。正如您所指出的,在多核系统下,完全有可能同时对 begin 的两个“锁定”调用。但是,任何使用监视器的高级应用程序环境都会将监视器转换为编译字节码中的semaphore 请求(或者,取决于您的操作系统和语言细节,互斥请求)。

    信号量在操作系统和/或硬件级别实现,更高级别的语言与它们绑定。在操作系统级别,它们“保证”是原子的。也就是说,任何获取信号量的程序都保证在那个时间点是唯一这样做的。如果两个程序或一个程序中的两个线程同时尝试获取锁,一个会先获取(成功),另一个会先获取(失败)。

    此时,“如何确保同步”不再是应用程序员担心的问题,而是开始成为操作系统设计人员和硬件设计人员的问题。

    其结果是,作为应用程序编码人员,您可以放心地假设“lock(objLock)”将是一个原子调用,无论您在系统中插入多少 CPU。

    【讨论】:

    • 那么,您是说操作系统将在真正的并行环境中确保多核之间的任务同步?
    • @ Miguel - 是的。操作系统负责确保获取锁的尝试永远不会同时发生,即使在真正的并行环境中也是如此。
    【解决方案3】:

    您的担心正是为什么我们需要像lock 这样的特殊机制并且不能简单地使用布尔标志。

    “同时”问题的解决方案在于lock(调用Monitor.Enter())使用的算法。它涉及内存屏障和非常低级内存机制的知识,以确保没有 2 个线程可以同时获取锁。

    注意:我说的只是 .NET,而不是 Java。

    【讨论】:

    • Henk:Erica 说的是这种情况吗?即操作系统将确保跨内核的内存/任务同步?
    • @miguel:功能,是的。 Monitor 使用重量更轻的Interlocked 类,不需要帮助形成操作系统(= 昂贵)但可以保证多核上的正确性。
    • @Henk:但是在真正的并行环境中,Interlocked 肯定只能确保执行指令的 CPU 上的原子性?
    • 我猜对内存位置本身的读/写可能被操作系统序列化了?
    • Interlocked.Exchange 可以查看您是否成功。在此基础上,您可以构建锁定机制。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-01
    • 2021-10-20
    • 1970-01-01
    • 2020-02-02
    • 1970-01-01
    • 1970-01-01
    • 2016-06-11
    相关资源
    最近更新 更多