根据C11-memory_order文档:http://en.cppreference.com/w/c/atomic/memory_order
C++11-std::memory_order文档也是一样的:http://en.cppreference.com/w/cpp/atomic/memory_order
在强排序系统(如x86,SPARC,IBM大型机)中,释放-获取顺序是自动的。对于这种同步模式,不会发出额外的CPU指令,只影响某些编译器优化(例如,编译器禁止将非原子存储移动到原子存储-发布之前,也禁止执行非原子加载早于原子加载-获取)。
但是对于x86-SSE指令(除了[NT] - 非临时性,我们始终必须使用L / S / MFENCE),这是真的吗?
有人在这里说“sse指令...没有反向兼容性要求,内存顺序未定义”。据信,严格的可排序性是为与旧版本的x86处理器兼容而保留的,但是新命令,即SSE(除了[NT]),自动剥夺了释放-获取顺序,是吗?
MFENCE
,那么对于这些某些x86指令,std::memory_order_acq_req
也必须使用MOV+MFENCE
,对吗? - Alexstrcpy
没有使用“new”?https://dev59.com/IWMk5IYBdhLWcg3wrwBo#19088403 但是你可以在字符串std::string* p = new std::string("Hello");
的示例中看到“new” 用于Release-Acquire排序,或者如果你指的是“new SSE instructions”,那么std::string
可以有它们,通过我的问题链接:http://en.cppreference.com/w/cpp/atomic/memory_order - AlexMFENCE
用于“新的SSE指令”,那么获取-释放也需要在相同的“新的SSE指令”上使用MFENCE
。如果获取-释放不需要MFENCE
,那么顺序一致性也不需要它(只需要在STORE
后使用SFENCE
)。 - Alex