c - 并发:如何同时处理在两个不同内核上的两个线程中运行的单个函数(指令集)?
问题描述
假设有一个操作一些数据(全局)的函数(指令集 foo())。两个线程由每个执行此函数(foo())的进程产生。当这两个线程在两个不同的处理器内核上同时执行时,如何处理并发和数据保护(竞争条件)?
对于并发和数据保护,单核处理器和多核处理器在上述情况下的主要区别是什么?
解决方案
这是一个非常广泛的问题。有不同的技术可以解决这个问题。从用户的角度来看,最基本的想法是获取全局数据的锁(例如:mutex
在 POSIX 中),执行一些更新并释放锁。即使您获得了锁,在其他线程中读取相同数据时也可能存在不一致(请参阅Readers-writers)问题。因此,您必须访问读锁(请参阅此处)。这是处理并发的基本思想。
目前,多核系统或单核线程的并发性和数据保护是相似的,因为所有核都可以看到所有内存(本地缓存除外)。如果实施了适当的锁定机制,那么操作系统将负责缓存一致性。基本上,从用户的角度来看,单核和多核中的线程是相同的。
推荐阅读
- c# - Web API POST 请求后 XmlDocument 不同
- jenkins - 詹金斯脚本化管道阶段不等待其命令完成执行
- javascript - 如何将一些 API 数据从 v-for 循环保存到我的 mongodb?
- c++ - 是否可以在 Qt 中使用 QStyle 删除窗口图标?
- elasticsearch - 弹性搜索多重匹配
- c# - 用中文创建的目录,但我在 Windows 10 中设置了英文
- c# - EventHandler.BeginInvoke “安全”使用吗?
- java - spark读取csv中的重复列名
- kubernetes - Burrow 仪表板 UI 未显示
- php - 循环中的 if else,或者 if else 中的两个不同循环,带有函数调用,或者在 if-else 中重复相同的代码,哪个更好?