x86 和其他架构提供了特殊的原子指令(lock、cmpxchg 等),允许您编写“无锁”数据结构。但是随着越来越多的内核被添加,这些指令实际上必须在幕后完成的工作似乎会增加(至少要保持缓存一致性?)。如果今天在双核系统上原子添加需要大约 100 个周期,那么在 future 的 80 多核机器上可能需要更长的时间吗?如果您要编写持久的代码,那么使用锁实际上可能是一个更好的主意,即使它们今天速度较慢?
最佳答案
你是对的,一旦计数开始超过几十个,拓扑约束会以一种或另一种方式增加核心之间的通信延迟。我真的不知道 x86 公司处理这种扩展的意图是什么。
但是锁是根据原子操作来实现的。因此,尝试切换到它们并不会真正赢得胜利,除非它们以比您自己的手动原子操作尝试的更具可扩展性的方式实现。我认为,一般来说,对于类似单个 token 的争用,无论您拥有多少个核心,原子原语仍然是最快的方式。
正如克雷很久以前发现的那样,这里没有免费的午餐。在高级软件设计中,您尝试尽可能少地使用可能存在争议的资源,这总是会在大规模并行化应用程序中带来最大的返回。这意味着尽可能多地完成锁定获取的工作,但也要尽可能快。在极端情况下,这可能意味着在假设成功获取锁的情况下预先计算您的工作,尝试捕获它,并在成功时尽快完成,否则丢弃您的工作并重试失败。
关于multithreading - 随着更多 CPU 的添加,原子操作会变慢吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1585825/