Tro*_*yvs 1 c++ multithreading portability memory-model stdatomic
在像std :: atomic :: compare_exchange这样的函数中,有一些运行时参数,比如std :: memory_order_release,std :: memory_order_relaxed.(http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange)
我不确定这些内存顺序标志是否保证存在于各种cpu /架构中,如果某些cpus不支持标志,这个标志是否会导致崩溃或?似乎这些标志中的一些是为intel itanium等设计的,不确定std :: memory_order相关代码是否可移植.
你能提一些建议吗?
通常,无论您要求什么,编译器都可以自由地提供最强大的内存保证.
在某些平台上,有足够的放松保证.并非所有平台都支持这些轻松保证.在这些平台上,编译器必须提供严格更强的保证.
所以它们是可移植的,因为在你要求特别保证时,合规编译器必须提供保证或更好.
请注意,不仅仅是关注的硬件.某些优化和重新排序可能是合法的,取决于您要求的内存顺序保证.我不知道任何依赖于它的编译器,但我不是编译器专家.
C++标准确实具有所谓的"独立"实现的概念,它可以支持标准库的子集.但是,它还定义了即使是独立实现必须支持的极小功能.在该名单是整体的的<atomic>头.
所以是的,实现必须支持这些.
但是,这并不意味着特定标志将完全执行并且仅表示该标志所描述的内容.标志代表最小内存屏障,保证可见的特定内容.如果硬件实现没有较低级别的内存屏障,即使对于不需要它的标志,该实现也可能发出完整的内存屏障.
因此,您应该根据标准所说的编写代码,并让编译器对细节进行整理.如果在平台上证明效率低下,您可以检查装配,看看您是否能够改善问题.
但回答你的主要问题,是的,基于原子的代码是可移植的(模数编译器错误).