由於存儲器映射文件的行爲與普通存儲器[1]相似,所以它可以和任何其他存儲器一樣工作。
這將編譯(在使用clang++3.6 -Wall -Wextra
),但是在技術上是未定義的(因爲std::atomic<T>
是不能保證是相同類型的或具有相同的對準規則爲T
):
std::atomic<uint64_t> *p;
p = reinterpret_cast<std::atomic<uint64_t>*>(&dest[index]);
p->fetch_add(value);
這應該是克良好++和鐺++:
dest[index] = __sync_fetch_and_add(&dest[index], value);
(兩個產生幾乎相同的彙編代碼, - 後者使用xaddq
[返回原始值],其中前者使用addq
- usign __sync_add_and_fetch
會做同樣的addq
,我希望)
[1],因爲它是普通內存 - Linux中的映射機制正是處理普通內存相同的機制,比如在交換輸入/輸出數據時,你有沒有足夠的可用內存,或者如果您在剛啓動的應用程序中使用代碼/數據。雖然我無法訪問Windows源代碼,但我相信這也是真的。其他操作系統可能會以一種完全不同的方式實現它,但是沒有理由相信它會阻止原子操作的發揮。
只有多個線程訪問映射。所以std :: atomic只是用於單個值,並且沒有辦法使內存塊成爲原子,就像數組一樣?除了使每個元素本身都是原子單一值?沒有考慮平臺的細節。感謝你及時的答覆! – Lazarus535 2014-10-20 21:15:16
__sync_fetch_and_add的虛擬+1!太低的代表依然是:-( – Lazarus535 2014-10-20 21:25:08
@ Lazarus535:'std :: atomic'是一個模板,所以理論上你可以有一個任何類型的原子變量,包括一個數組或者一個大的結構,然而,[只有某些特殊化纔是鎖定的(http://en.cppreference.com/w/cpp/atomic/atomic/is_lock_free)(理想情況下,硬件支持的所有硬件都支持,給定標準庫的有效實現),原子性通過正常所有其他類型的互斥量(實現的內部)還要注意,原子變量數組與包含數組的原子變量完全不同:-) – Cameron 2014-10-20 21:30:42