C++ 内存排序和正确编程实践的保证
关于我在下面描述的订购,我有一些相关的问题C++ 内存排序和正确编程实践的保证,c++,c++11,gcc,intel,amd-processor,C++,C++11,Gcc,Intel,Amd Processor,关于我在下面描述的订购,我有一些相关的问题 考虑到这些订购保证,我在很多地方不需要明确的围栏。但是,如何向编译器表达“围栏”,特别是GCC?也就是说,只要优化器没有对我的程序重新排序,程序顺序的保证就适用 是否有使用中的普通/流行新芯片具有不提供此类保证的通用内核 我对C++0x的交错思想有点困惑。我必须使用“原子”类来使用这些保证,或者草案中是否有其他方面也提供了使用这些保证的方法 内存排序 英特尔和AMD(至少有x86_64)都保证内存加载与在单个处理器上执行的存储操作是顺序的。也就是说,
内存排序 英特尔和AMD(至少有x86_64)都保证内存加载与在单个处理器上执行的存储操作是顺序的。也就是说,如果某个处理器执行这些存储:
asm
块,并明确写出mov
指令。即使平台保证顺序一致性,当多个线程访问同一个内存位置并且其中至少有一个线程写入该位置时,您将始终需要某种类型的同步来防止争用情况。C++0x提供了三种实现此类同步的方法:
std::互斥
和相关类std::Atomic
std::原子线程围栏
后两者接受一个内存顺序参数,允许在不保证顺序一致性的平台上具有额外的灵活性(仅限专家!),但这与x86无关。不幸的是,这既不是必要的,也不是充分的。除非也使用了适当的屏障指令,否则CPU内核在运行时可以自由地对指令进行重新排序,如果它认为可以逃脱惩罚的话。这些屏障也可以作为更高级的原语使用,不需要使用汇编。@Johannes:他在问题中声称Intel指定了加载/存储顺序。现在,我还没有亲自检查,但如果他是对的,那么他想要的效果就可以在x86上得到保证,而无需明确的CPU屏障。@Zan Lynx:不,Johannes Dahlström是对的。将移动按特定顺序进行并不意味着它们在二进制文件中会按该顺序结束。优化器可以自由交换指令,而指令(在x86上)也可以交换实际的存储。@mAlters:如果将代码放在汇编块中,编译器优化器将不会对其重新排序。它可以对整个块重新排序,gcc可以做到这一点。但它不会对块内的代码重新排序。@Zan Lynx:您继续声称存在一条禁止此重新排序的规则;请指出。我不能证明没有这样的规则。顺序保证是避免数据竞争的一种方法。在低级别上,我们不希望使用互斥,因为它太昂贵了。问题更多的是如何以独立于平台的方式使用其他内存排序保证。
原子线程围栏
是我在标准中非常不清楚的部分。这一措辞似乎暗示,排序只保证用于原子类型,这几乎是无用的。我要问一个更有针对性的问题。