[英]memcpy() safety on adjacent memory regions
我最近提出了一個關於使用volatile的問題,並被指示閱讀英特爾和其他人討論內存障礙及其用途的一些非常有用的文章。 看完這些文章后,我變得非常偏執。
我有一台64位機器。 從多個線程記憶到相鄰的,非重疊的內存區域是否安全? 例如,假設我有一個緩沖區:
char buff[10];
一個線程是否總是安全地記憶到前5個字節,而第二個線程復制到最后5個字節?
我的直覺反應(和一些簡單的測試)表明這是完全安全的,但我無法在任何可以完全說服我的文件中找到文檔。
安全,是的。 高性能,至少在這個有限的例子中。 請記住,一個緩存行不能同時位於兩個核心中。 當核心B寫入緩沖區時,您將強制核心A等待,然后在傳輸內存時等待,然后寫入它。 多核內存副本的大小應該非常大,以避免這種影響。
是的,它是完全安全的,對存儲器總線的訪問的序列化是在硬件中完成的。
只要memcpy的每個實例都認為它只寫入緩沖區的一部分,它就完全安全了。 C ++中任何形式的數組分配都是非常低級的; 它是一個連續的存儲塊,以適當的大小分配給程序,而數組作為一個對象存在於指針以外的任何東西只是一種幻覺。 給出memcpy不重疊的數組范圍,並且它無法知道它們不僅僅是兩個完全獨立的數組,恰好彼此相鄰。 寫入不會干擾。
是的,這與任何類型的事件完全無關 - 在訂購之前。 它只是復制字節。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.