I know that copying and reseting a single
std::shared_ptr<T> global_t(new T());
// Thread 1
do something with t1
// Thread 2
do something with t2
std::shared_ptr is always internally synchronized, so concurrent copying is ok (though might be less performant). And the managed object is only freed when its refcount drops to zero.
Which is the reason your first scenario has two possible defined results, instead of being UB: First resetting and then copying a reset shared_ptr, or first copying and then resetting the original shared_ptr.