c ++,std :: atomic,什么是std :: memory_order以及如何使用它们?
任何人都可以解释什么是简单的英文std :: memory_order,以及如何使用它们与std :: atomic <>?
我在这里find了参考和几个例子,但是根本不理解。 http://en.cppreference.com/w/cpp/atomic/memory_order
谢谢。
任何人都可以用简单的英文解释什么是std :: memory_order,
对于各种记忆顺序,我发现最好的“简单英语”解释是关于轻松primefaces的Bartoz Milewski的文章: http ://bartoszmilewski.com/2008/12/01/c-atomics-and-memory-ordering/
和后续的post: http : //bartoszmilewski.com/2008/12/23/the-inscrutable-c-memory-model/
但是请注意,虽然这些文章是一个很好的介绍,但它们是在C ++ 11标准之前进行的,并不会告诉你所有你需要知道的安全使用它们。
以及如何使用它们与std :: atomic <>?
我对你最好的build议是: 不要 。 轻松的primefaces是(可能)在C ++ 11中最棘手和最危险的事情。 坚持std::atomic<T>
与默认的内存sorting(顺序一致性),直到你真的,真的确定你有一个性能问题,可以通过使用宽松的内存sorting来解决。
在上面的第二篇文章中,Bartoz Milewski得出以下结论:
当我尝试推理C ++弱primefaces时,我不知道自己在做什么。 背后的理论是如此的复杂,以至于它是无法用边界线的。 我们花了三个人(安东尼,汉斯和我),并对标准进行了修改,以完成一个相对简单的algorithm的certificate。 想象一下,对于基于弱primefaces的无锁队列也是这样做的!
std::memory_order
值允许你在primefaces操作提供的内存顺序上指定细粒度的约束。 如果您正在修改和访问来自多个线程的primefacesvariables,那么将std::memory_order
值传递给您的操作可以让您放松编译器和处理器上关于这些primefacesvariables的操作对其他线程可见的顺序的约束,以及这些操作对应用程序中的非primefaces数据的同步效果。
std::memory_order_seq_cst
的默认sorting是最受限制的,并提供了您可能期望的“直观”属性:如果线程A存储了一些数据,然后使用std::memory_order_seq_cst
设置primefaces标志,那么如果线程B看到标志是那么它可以看到由线程A写入的数据。其他内存顺序值不一定提供这种保证,因此必须非常小心地使用。
基本的前提是:不要使用std::memory_order_seq_cst
(默认)以外的任何东西,除非(a)你确实知道自己在做什么,并且可以certificate在所有情况下,放松的用法是安全的,(b)分析器表明,您打算使用轻松sorting的数据结构和操作是一个瓶颈。
我的书“ C ++ Concurrency in Action”专门讨论了C ++内存模型,primefaces操作和std::memory_order
约束的一整章(45页),还有一章(44页)使用primefaces操作进行locking同步免费的数据结构,以及宽松的sorting约束的后果。
我的Dekkeralgorithm博客条目和Peterson的互斥algorithm演示了一些问题。
不。“简单英语”的解释需要32页,可以在这里find。
如果你不想阅读,你可以忘记内存sorting,因为你链接到的页面说,默认是顺序一致的sorting,这是“总是做理智的事情” – 设置。
要使用任何其他设置,你必须阅读和理解上面的文章和其中的例子。
简而言之,您的编译器和CPU可能会按照与写入方式不同的顺序执行指令。 对于单线程,这不是一个问题,因为它看起来是正确的。 对于多个处理器上的multithreading,这成为一个问题。 C ++中的内存sorting限制了你的编译器/ CPU的function,并修复了这些问题。
例如,如果你看看我的文章中的双重检查locking,你可以看到如何sorting这种模式messes – 它提到显示primefaces内存顺序可以用来解决它。
关于重新sorting本身,您也可以考虑CPU重新sorting – 同样,编译器也可能正在重新sorting。
请注意,这个主题(包括我的)提供的任何文件都提到理论场景。 最常见的CPU,如x86,有非常强大的sorting保证,因此很多显式sorting是根本不需要的。 因此,即使你不使用适当的C ++ 11primefaces,你的代码仍然可以工作。
正如zvrba提到的,这个话题其实很详细。 内存障碍的linux内核doc还包含了大量的详细信息。
GCC维基中有一些纯英文的。 ;)