Безопасна ли обменная потоковая передача shared_ptr?

Вот некоторые фрагменты кода.

std::shared_ptr<int> global(new int(1)); 


void swapper(int x)
{
    std::shared_ptr<int> sp(new int(x));  
    global.swap(sp); 
}

Предположим, что я хотел вызвать swapper в параллельных потоках. Будет ли это потокобезопасным?

Я знаю об этом . Он показывает, как назначение указателя не является потокобезопасным, если я переназначаю значение global.

Мой вопрос в том, что функция-член swap сама по себе является потокобезопасной.

С одной стороны, функции блока управления shared_ptr являются потокобезопасными. С другой стороны, я предполагаю, что я перемещаю указатели на блоки управления, поэтому он не должен быть потокобезопасным.

Какая там связь? Безопасен ли поток swap?

Ответ 1

Нет, swap не является потокобезопасным, но есть еще одна функция, которая:

atomic_store(&global, sp);

Там также atomic_exchange, который возвращает старое значение, если вам это нужно.