2012-06-09 2 views
12

при чтении C++ 11 проекта n3242, раздел 20.7.2.5, похоже, у нас есть атомарные операции на shared_ptr, что позволяет нам сделать замок свободного от сложной структуры, не заботясь о GC /утечка памяти.атомарных операций для shared_ptr в C++ 11

Однако я не смог использовать его в GCC-4.7.0. Я просто протестировали следующую программу

#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); 
} 

и имеет ошибку компиляции:

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

Кто-нибудь знает, что я пропустил здесь? Или это просто gcc еще не реализовано?

+0

Внутренний счетчик ссылок shared_ptr <> 'будет атомарно увеличен и уменьшен без записи каких-либо специальных. Что вы пытаетесь сделать с 'atomic_load' точно ..? – ildjarn

+0

@ildjarn, прочтите это http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2674.htm –

+0

@ildjarn Если потоки меняют то, что указывает переменная shared_ptr, вам нужно избегать когда вы получаете доступ к самому shared_ptr. – bames53

ответ

2

Похоже, что это еще не в libstdC++.

Это также не в LIBC++

VS11 бета имеет его. Я думаю, что это первое, что я нашел в библиотеке VS11, которая не была в libC++.

+0

Есть ли у вас какие-либо идеи, когда это может быть реализовано GCC? –

+0

Нет, не знаю .... – bames53

+0

У меня нет VS11 на моей руке, поэтому мне любопытно, как VS11 реализует atomic_load/atomic_store/atomic_compare_and_exchange. Это реализовано с помощью блокировки спина? –

3

Существует предложение по принизить эти методы atomic_store/atomic_load для shared_ptr в пользу нового класса atomic_shared_ptr: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4162.pdf

Так к тому времени, вы получаете libstC++ версии atomic_load очень может содержать новые атомные указатели уже, что лучше в нескольких аспектах.

MSVC STL реализовал эти методы некоторое время назад, а libC++ также требует полного соответствия C++ 11/14, поэтому они должны быть доступны в последних версиях.

-6

Используйте clang ++ с -std = C++ 11 для компиляции кода, который должен заставить его работать.