Concurrency 关于萨特的几个问题';Dobbs博士的s并发系列

Concurrency 关于萨特的几个问题';Dobbs博士的s并发系列,concurrency,hardware,Concurrency,Hardware,关于Sutter关于Dobbs博士的并发系列我有几个问题 1) Sutter建议将不需要锁的代码移出关键部分,以便(除了增加关键部分的粒度外)在嵌套调用本身进入关键部分的情况下避免嵌套关键部分。我一直这样做,但正如他在“使用关键部分(最好是锁)来消除竞争”中指出的那样,编译器可以将代码移动到关键部分。那么,这是否是一种可靠的方法来强制实施锁层次结构并防止嵌套关键部分(这可能导致死区) 2) 在“最大化局部性,最小化争用”一文中,Sutter给出了有关如何利用硬件知识组织数据以提高并发性的示例和建

关于Sutter关于Dobbs博士的并发系列我有几个问题

1) Sutter建议将不需要锁的代码移出关键部分,以便(除了增加关键部分的粒度外)在嵌套调用本身进入关键部分的情况下避免嵌套关键部分。我一直这样做,但正如他在“使用关键部分(最好是锁)来消除竞争”中指出的那样,编译器可以将代码移动到关键部分。那么,这是否是一种可靠的方法来强制实施锁层次结构并防止嵌套关键部分(这可能导致死区)

2) 在“最大化局部性,最小化争用”一文中,Sutter给出了有关如何利用硬件知识组织数据以提高并发性的示例和建议(例如缓存大小和对一个核心或一组核心的独占性等)。他提出的一个建议是,在一个类中添加一个“虚拟”成员,将两个有争议的成员分隔开来,迫使它们进入单独内核上的单独缓存线,从而允许对这些成员进行并发工作。我该怎么做?考虑到编译器、处理器和缓存对代码的控制能力,我如何知道这种硬件级设计是否有效?我怎样才能让别人相信我的代码是有效的?对我来说,这就像是黑魔法。所以有两件事是正确的:(1)本文是blue sky软件开发,或者(2)我错过了一些非常酷的知识和技巧。我怀疑是后者。有人能告诉我如何/从哪里开始正确地设计并发代码,或者至少告诉我从哪里开始学习吗


非常感谢

这可能看起来很激烈,但是

使用具有定义的内存、优化和同步语义的语言

否则

尝试将代码放入其他编译单元。许多编译器会尊重每个编译单元的“不要优化”。 如果你幸运的话,也许你可以使用内联的一些pragma

基本上,如果该语言没有定义内存这些语义,那么编译器供应商将任由您摆布