我最近在using volatile上提出了一个问题,并被指示阅读英特尔和其他人讨论内存障碍及其用途的一些非常信息性文章。看完这些文章后,我变得非常偏执。
我有一台64位机器。从多个线程记忆到相邻的,非重叠的内存区域是否安全?例如,假设我有一个缓冲区:
char buff[10];
一个线程是否总是安全地记入前5个字节,而第二个线程复制到最后5个字节?
我的直觉反应(和一些简单的测试)表明这是完全安全的,但我无法在任何可以完全说服我的文件中找到文档。
答案 0 :(得分:7)
安全,是的。高性能,至少在这个有限的例子中。请记住,一个缓存行不能同时位于两个核心中。当核心B写入缓冲区时,您将强制核心A等待,然后在传输内存时等待,然后写入它。多核内存副本的大小应该非常大,以避免这种影响。
答案 1 :(得分:4)
是的,它是完全安全的,对内存总线的访问序列化是在硬件中完成的。
答案 2 :(得分:2)
只要每个memcpy实例都认为它只写入缓冲区的一部分,它就完全安全了。 C ++中任何形式的数组分配都是非常低级的;它是一个连续的存储块,以适当的大小分配给程序,而数组作为一个对象存在于指针以外的任何东西只是一种幻觉。给出memcpy不重叠的数组范围,并且它无法知道它们不仅仅是两个完全独立的数组,恰好彼此相邻。写入不会干扰。
答案 3 :(得分:0)
是的,这与订购之前的任何事情完全无关。它只是复制字节。