lundi 18 mai 2020

Is * operator of std::shared_ptr thread safe?

I have a std::shared_ptr which changes asynchronously from a callback.

In main thread, I want to read the "latest" value and do complex calculations on it, and I do not care if the pointer's value changes while those calculations are running.

For this, I am simply making a copy of the contained value on the main thread:

// async thread
void callback(P new_data) {
  smart_pointer_ = new_data;
}

// main thread loop!
Value copy_of_pointer_value = *smart_pointer_; // smart_pointer_ could be changing in callback right now
// do calcs with copy_of_pointer_value

Is this safe or should I be explicitly making a copy of the smart pointer before trying to read its value, like this:

// main thread loop!
auto smart_copy = smart_pointer_;
// I know I could work with *smart_copy directly, but I need to copy anyway for other reasons
Value copy_of_pointer_value = *smart_copy;
// do calcs with copy_of_pointer_value

Aucun commentaire:

Enregistrer un commentaire