【问题标题】:Concurrency : How to handle a single function(set of instruction) running in two threads on two different cores simultaneously? [closed]并发:如何同时处理在两个不同内核上的两个线程中运行的单个函数(指令集)? [关闭]
【发布时间】:2019-12-10 02:45:59
【问题描述】:

假设有一个函数(一组指令 foo())可以操作一些数据(全局)。两个线程由每个执行此函数(foo())的进程产生。 当这两个线程在两个不同的处理器内核上同时执行时,如何处理并发和数据保护(竞争条件)?

对于并发和数据保护,上述情况下单核和多核处理器的主要区别是什么?

【问题讨论】:

  • 在用户模式设置中,多核多处理有点像最坏情况下的单核多处理。有很多方法可以处理并发。其中之一是使用 C11 的<stdatomic.h>。在 POSIX 上,有 pthread mutexes
  • 这两种情况的主要区别在于缓存。但是,如果您采取了所有正确的内存保护预防措施,并在所有正确的位置使用互斥锁,那么人们会期望实现能够确保使用内存屏障和缓存刷新。
  • 已经有关于这个主题的书籍。这个问题太宽泛了。
  • 我从“Unix 网络编程,第 1 卷:套接字网络 API(第 3 版)”中学到了关于用 C 语言编写线程程序的大部分知识。

标签: c linux multithreading posix


【解决方案1】:

这是一个非常广泛的问题。有不同的技术可以解决这个问题。从用户的角度来看,最基本的想法是获取全局数据的锁(例如:mutexin POSIX),执行一些更新并释放锁。即使您获得了锁,其他线程中读取相同数据时也可能存在不一致(请参阅Readers-writers)问题。因此,您必须访问读锁(参见here)。这是处理并发的基本思路。

目前,多核系统或单核线程的并发和数据保护是相似的,因为所有核都可以看到所有内存(本地缓存除外)。如果实施了适当的锁定机制,那么操作系统将负责缓存一致性。基本上,从用户的角度来看,单核和多核中的线程是相同的。

【讨论】:

    猜你喜欢
    • 2019-11-17
    • 2020-09-12
    • 1970-01-01
    • 2012-12-04
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 2018-06-02
    • 1970-01-01
    相关资源
    最近更新 更多