2016-02-17 58 views
1

標題幾乎傳達的所有相關信息,但這裏有一個最小的攝製:鏈接並行線程禁用無鎖的shared_ptr實現

#include <atomic> 
#include <cstdio> 
#include <memory> 

int main() { 
    auto ptr = std::make_shared<int>(0); 
    bool is_lockless = std::atomic_is_lock_free(&ptr); 
    printf("shared_ptr is lockless: %d\n", is_lockless); 
} 

與下列編譯器選項編譯這就產生了一個無鎖shared_ptr實現:

g++ -std=c++11 -march=native main.cpp 

雖然這並不:

g++ -std=c++11 -march=native -pthread main.cpp 

GCC版本:5.3.0(在Linux上,使用libstdc++)在多臺機器上進行測試,這些機器應具有必要的原子指令以使其工作。

有沒有辦法強制實現無鎖(我需要無鎖版本,無論性能如何)?

回答

1

如果你在線程環境中使用shared_ptr,你需要鎖定某些類型的鎖 - 它們可以被實現爲原子增量和減量,但可能會有一些需要「更大」的鎖來確保沒有比賽]。無鎖版本僅適用於只有一個線程的情況。如果您不使用線程,請不要鏈接-lpthread。我確信有一些棘手的方式來說服編譯器,你並不是真的在共享指針中使用線程,但是如果你真的在脆弱的領域中工作 - 如果shared_ptr被傳遞給線?你可能能夠保證現在,但有人可能會意外地或有意地將一個引入到運行在不同線程中的東西,而這一切都會中斷。

7

有兩個單獨的東西:

  • 在控制塊引用計數器(或等效物)的操縱通常與無鎖原子公司whenever possible實現。這是不是什麼std::atomic_is_lock_free告訴你。

    • 的libstdC++的__shared_ptrtemplated on the lock policy,所以你可以明確地使用

      template<typename T> 
      using shared_ptr_unsynchronized = std::__shared_ptr<T, __gnu_cxx::_S_single>; 
      

      如果你知道自己在做什麼。

  • std::atomic_is_lock_free告訴你shared_ptr原子訪問功能(std::atomic_{store, load, exchange, compare_exchange}等)是否是無鎖的。這些函數用於同時訪問相同的對象,典型的實現將使用互斥鎖。