6
所以我有一個簡單的cow_ptr
。它看起來是這樣的:使用shared_ptr寫複製
template<class T, class Base=std::shared_ptr<T const>>
struct cow_ptr:private Base{
using Base::operator*;
using Base::operator->;
using Base::operator bool;
// etc
cow_ptr(std::shared_ptr<T> ptr):Base(ptr){}
// defaulted special member functions
template<class F>
decltype(auto) write(F&& f){
if (!unique()) self_clone();
Assert(unique());
return std::forward<F>(f)(const_cast<T&>(**this));
}
private:
void self_clone(){
if (!*this) return;
*this = std::make_shared<T>(**this);
Assert(unique());
}
};
這樣可以保證它擁有一個非const T
,並確保它是unique
當.write([&](T&){})
s到它。
c++17棄用.unique()
似乎表明此設計存在缺陷。
我猜測,如果我們開始與在線程A 1
一個cow_ptr<int> ptr
,它傳遞給線程B,使其具有唯一性,其修改爲2
,通過ptr
回讀它的線程A
,我們已經產生了種族條件。
我該如何解決這個問題?我可以簡單地在write
中添加內存障礙嗎?哪一個?還是這個問題更根本?
由於x86內存一致性超出了C++的要求,x86上的症狀可能性較低嗎?