5

我最近问了一个关于使用 volatile的问题,并被指示阅读Intel 和其他人讨论内存屏障及其用途的一些内容丰富的文章读完这些文章后,我变得很偏执。

我有一台 64 位的机器。从多个线程 memcpy 到相邻的、非重叠的内存区域是否安全?例如,假设我有一个缓冲区:

char buff[10];

一个线程将内存存储到前 5 个字节,而第二个线程复制到最后 5 个字节总是安全的吗?

我的直觉反应(和一些简单的测试)表明这是完全安全的,但我无法在任何地方找到可以完全说服我的文档。

4

4 回答 4

7

安全,是的。至少在这个有限的例子中是高性能的,不。请记住,一个高速缓存行不能同时位于两个内核中。您将强制核心 A 在核心 B 写入缓冲区时等待,然后在内存传输时等待,然后再写入。多核内存副本的大小应该非常大,以避免这种影响。

于 2011-01-14T19:58:35.733 回答
4

是的,它完全安全,对内存总线的访问序列化是在硬件中完成的。

于 2011-01-14T19:50:53.260 回答
2

只要 memcpy 的每个实例都认为它只写入缓冲区的一部分,它就是完全安全的。C++ 中任何形式的数组分配都是非常底层的;它是以适当大小为程序分配的连续存储块,而数组作为对象存在,除了指针之外的任何东西都只是一种错觉。给 memcpy 数组的非重叠范围,它无法知道它们不仅仅是两个恰好彼此相邻的完全独立的数组。写入不会干扰。

于 2011-01-14T19:50:49.293 回答
0

是的,这与订购前发生的任何事情完全无关。它只是复制字节。

于 2011-01-14T20:00:25.190 回答