При использовании COW блокировка требуется только при копировании объектов, которые могут находиться в процессе изменения.
Таким образом, если COW объекта является объектом, установленным перед потоками и никогда не изменяется, блокировка не требуется.
Однако, если вы делаете копии копий, вам нужно хотя бы заблокировать во время начальной записи или убедиться, что копия имеет все изменения, прежде чем ее можно будет копировать снова.
Если вы не можете полностью гарантировать это, используйте блокировку или атомарные обновления.
Если вы хотите заблокировать:
Кажется, сейчас в стволе есть атомная версия.
Если вы не можете обновить boost, вы можете либо импортировать необходимые функции на данный момент, либо обернуть их в блокировку, например блокировку чтения / записи.
из shared_ptr.hpp
template<class T> shared_ptr<T> atomic_exchange( shared_ptr<T> * p, shared_ptr<T> r )
{
boost::detail::spinlock & sp = boost::detail::spinlock_pool<2>::spinlock_for( p );
sp.lock();
p->swap( r );
sp.unlock();
return r; // return std::move( r )
}
статья о RWLocks