首页 > 解决方案 > 并发:如何同时处理在两个不同内核上的两个线程中运行的单个函数(指令集)?

问题描述

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

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

标签: clinuxmultithreadingposix

解决方案


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

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


推荐阅读