2012-06-09 26 views
12

Odczytanie szkicu C++ 11 n3242, sekcja 20.7.2.5, wygląda na to, że mamy operacje atomowe na shared_ptr, co pozwala nam na blokowanie skomplikowanej struktury bez martwienia się o GC /wyciek pamięci.Operacje atomowe dla shared_ptr w C++ 11

Jednak nie mogłem z powodzeniem używać go w GCC-4.7.0. Po prostu przetestowane następujący program

#include <atomic> 
#include <memory> 
#include <string> 

struct X { 
    int x; 
    double y; 
    std::string s; 
}; 

int main() { 
    std::shared_ptr<X> x(new X); 
    auto p = std::atomic_load(&x); 
} 

i ma błąd kompilatora:

c.cpp:13:33: error: no matching function for call to ‘atomic_load(std::shared_ptr<X>*)’ 

Czy ktoś wie, co brakowało mi tutaj? A może po prostu GCC jeszcze tego nie zaimplementował?

+0

Wewnętrzna liczba referencyjna 'shared_ptr <>' będzie atomowo zwiększana i zmniejszana bez pisania żadnych specjalnych. Co dokładnie próbujesz zrobić z 'atomic_load'? – ildjarn

+0

@ildjarn, przeczytaj ten http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2674.htm –

+0

@ildjarn Jeśli wątki zmieniają się, co wskazuje zmienna shared_ptr, musisz unikać Wyścigi danych podczas uzyskiwania dostępu do samego shared_ptr. – bames53

Odpowiedz

2

Wygląda na to, że po prostu nie jest jeszcze w bibliotece libstdC++.

Nie jest również w libC++

VS11 beta ma. Myślę, że to pierwsza rzecz, jaką znalazłem w bibliotece VS11, która nie była w bibliotece libC++.

+0

Czy masz jakieś pojęcie, kiedy to może zostać zaimplementowane przez GCC? –

+0

Nie, nie mam pojęcia ... – bames53

+0

Nie mam VS11 z mojej strony, więc jestem ciekawy jak VS11 implementuje atomic_load/atomic_store/atomic_compare_and_exchange. Czy jest realizowany za pomocą blokady spin? –

3

Jest propozycja, aby potępiać tych metod atomic_store/atomic_load dla shared_ptr na rzecz nowej klasy atomic_shared_ptr: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4162.pdf

Więc do czasu uzyskania libstC++ wersję z atomic_load może równie dobrze zawierać nowe wskaźniki atomowych już, które są lepsze w kilku aspektach.

MSVC STL zaimplementował te metody jakiś czas temu, a libC++ również zapewnia pełną zgodność z C++ 11/14, więc muszą być dostępne w najnowszych wersjach.

-6

Użyj clang ++ z -std = C++ 11 do kompilacji kodu, który powinien sprawić, że będzie działał.

Powiązane problemy