2017-07-25 15 views
2

++的實現原子交換(https://gcc.gnu.org/ml/libstdc++/2014-10/msg00154.html):如何是性病的原子交換:基於關閉的libstdc的shared_ptr中的libstdC++正確

它看起來像16個互斥體是靜態分配的。當需要進行原子交換時,交換代碼會散列2個指針,以交換到這些靜態互斥鎖,鎖和交換中的一個(或兩個)。但是,如果shared_ptr在線程之間共享並且正在被併發訪問,那麼互斥體如何幫助保證併發訪問和修改的同步?我猜測代碼假定內部原始指針的正確對齊,但這是一個x86規則,而不是C++的保證。我錯過了什麼讓交換原子和正確,沒有額外的鎖定每個基本原始指針的讀取?

+3

標準庫實現可以自由地依賴平臺特定的細節。 – molbdnilo

回答

1

atomic_*功能相對於彼此只是原子。換句話說,同時訪問由atomic_exchange修改的shared_ptr的唯一有效方法是通過atomic_load,它將採用相同的互斥鎖(基於shared_ptr的地址)並阻塞,直到完成atomic_exchange

4

libstdC++不必每平臺上工作。它只需要在它的工作平臺上工作。

在不適用的平臺上,它不是標準庫的實現。使用不同的。

只要安裝和「使用」(連接到編譯器的環境)libstdC++(編譯器維護者通常)在使用它之前檢查他們的平臺假設,這裏沒有問題。

通常,您不能以完全平臺無關的方式實現std庫。你甚至不能以獨立於編譯器的方式實現它,因爲std需要做的一些事情不能用C++來完成,沒有std庫支持。