我正在寻找重新排序代码的事情,甚至可能在多处理器的情况下破坏代码。
答案 0 :(得分:13)
最重要的一个是内存访问重新排序。
缺少内存屏障或序列化指令,处理器可以自由重新排序内存访问。某些处理器架构限制了它们可以重新排序的程度; Alpha被认为是最弱的(即可以重新排序最多的那个)。
可以在Documentation/memory-barriers.txt的Linux内核源文档中找到对该主题的非常好的处理。
大多数情况下,最好使用编译器或标准库中的锁定原语;这些都经过了充分的测试,应该具备所有必要的内存障碍,并且可能已经非常优化(优化锁定原语很棘手;甚至专家也可能有时会弄错)。
答案 1 :(得分:0)
是的,但究竟是什么问题?
然而,由于这是一个有趣的话题:编译器和处理器用来优化代码的技巧不应该破坏代码,即使有多个处理器,在该代码中没有竞争条件。这被称为顺序一致性的保证:如果您的程序没有任何竞争条件,并且所有数据在访问之前都被正确锁定,则代码将表现为顺序执行。
有一个非常好的Herb Sutter视频在这里谈论这个:
http://video.google.com/videoplay?docid=-4714369049736584770
每个人都应该注意这一点:)
答案 2 :(得分:0)
维基百科有一个相当全面的优化技术列表here。
答案 3 :(得分:0)
DavidK的回答是正确的,但要了解您的语言/运行时的内存模型也非常重要。即使没有竞争条件以及顺序一致性和互斥量使用,当数据被在cpu的不同核心中运行的不同线程缓存时,代码仍然会中断。有些语言,Java就是一个例子,当使用互斥锁时,确保线程之间的数据状态,但很少能够确保没有两个线程可以同时访问数据。您需要以正确的方式使用互斥锁,以确保语言运行时同步两个线程之间的数据状态。在java中,这是通过让两个线程在同一个对象上同步来完成的。
这是一个很好的页面,解释了这个问题以及如何在javas内存模型中处理它。