【问题标题】:Multicores: Accessing shared memory at the same time多核:同时访问共享内存
【发布时间】:2012-03-29 16:41:32
【问题描述】:

在多核中同时访问共享内存有什么规则吗? 如果一个核心正在写入共享内存,另一个核心在完全相同的时间读取相同的内存,这有什么问题吗? 这种情况应该避免吗?

【问题讨论】:

    标签: shared-memory


    【解决方案1】:

    这称为竞争条件,此类代码的结果将是不可预测的。你必须避免它。您可以:

    • 更改算法以使用单独的内存,或
    • 使用原子操作同步访问,或
    • 使用更高级别的同步结构(如临界区或互斥锁)同步访问。

    正如@DanDan 所说,只从多个线程中读取是没有问题的。

    【讨论】:

    • 可以使用互斥信号量来避免这种情况吗?例如:一个核心 if(!LOCK) LOCK=TRUE;另一个核心 if(!LOCK) LOCK=TRUE,并且 LOCK 在两个核心之间共享。当一个核在执行LOCK=TRUE时,另一个核恰好同时执行了if(!LOCK),这样可以吗?
    • 不,这也是布尔变量的竞争条件。您必须使用适当的互斥对象(无论这对您的语言/操作系统意味着什么)。
    【解决方案2】:

    是的,您需要避免这种情况。唯一可以安全地使用多核和多线程执行的操作是同时读取 - 并且只有在没有副作用的情况下。

    【讨论】:

    • 可以使用互斥信号量来避免这种情况吗?例如:一个核心 if(!LOCK) LOCK=TRUE;另一个核心 if(!LOCK) LOCK=TRUE,并且 LOCK 在两个核心之间共享。当一个核在执行LOCK=TRUE时,另一个核恰好同时执行了if(!LOCK),这样可以吗?
    • 如果板上没有操作系统怎么办,我们应该使用IRQ来避免内核同时访问吗?对此有何其他建议?
    猜你喜欢
    • 2018-05-07
    • 1970-01-01
    • 2011-11-21
    • 1970-01-01
    • 2021-11-26
    • 2019-03-04
    • 1970-01-01
    • 1970-01-01
    • 2016-06-12
    相关资源
    最近更新 更多