2017-07-25 58 views
3

請參閱this鏈接:在atomic_exchange_strong_explicit的實施shared_ptr的

template<typename _Tp> 
    bool 
    atomic_compare_exchange_strong_explicit(shared_ptr<_Tp>* __p, 
              shared_ptr<_Tp>* __v, 
              shared_ptr<_Tp> __w, 
              memory_order, 
              memory_order) 
    { 
    shared_ptr<_Tp> __x; // goes out of scope after __lock 
    _Sp_locker __lock{__p, __v}; 
    owner_less<shared_ptr<_Tp>> __less; 
    if (*__p == *__v && !__less(*__p, *__v) && !__less(*__v, *__p)) 
     { 
     __x = std::move(*__p); 
     *__p = std::move(__w); 
     return true; 
     } 
    __x = std::move(*__v); 
    *__v = *__p; 
    return false; 
    } 

對我來說,它看起來像*__p == *__v!__less(*__p, *__v) && !__less(*__v, *__p)雙方陳述的事實指針*__p*__v是相等的。他們爲什麼在那裏使用?

謝謝。

+0

請參閱https://stackoverflow.com/questions/21834131/stdshared-ptrowner-before-and-stdowner-less-what-exactly-is-meant-by-own – ecatmur

回答

1

至於by this great answer我們需要確定兩個shared_ptrs共享相同的對象並共享該對象的所有權(這兩個共享指針是否使用相同的ref計數器?)。

*__p == *__v通過比較*__p.get() == *__v.get()然後!__less(*__p, *__v) && !__less(*__v, *__p)檢查第一部分,確保兩個共享指針共享內部參考計數器,從而滿足這兩個部分。

*__p == *__v只檢查擁有的對象是否相等,而不是內部ref計數器的共享狀態,這是我們在這裏需要的,這就是爲什麼我們需要額外的構造。