std::shared_ptr<int> int_ptr;
int main() {
int_ptr = std::make_shared<int>(1);
std::thread th{[&]() {
std::weak_ptr int_ptr_weak = int_ptr;
auto int_ptr_local = int_ptr_weak.lock();
if (int_ptr_local) {
cout << "Value in the shared_ptr is " << *int_ptr_local << endl;
}
});
int_ptr.reset(nullptr);
th.join();
return 0;
}
Является ли код над потоком безопасным? Я прочитал этот ответ About thread-safety of weak_ptr, но просто хотел удостовериться, что приведенный выше код является потокобезопасным.Доступ к `weak_ptr` и` shared_ptr` является атомарным
Я спрашиваю это, что если код выше действительно поточно, я не могу понять, как интерфейсы std::weak_ptr
и std::shared_ptr
сделать следующую операцию атомным expired() ? shared_ptr<T>() : shared_ptr<T>(*this)
. Мне просто кажется, что создание двух логических строк кода, подобных приведенным выше, невозможно сделать синхронным без использования какого-либо мьютекса или спин-блокировки.
Я понимаю, как атомные приращения работают с разными экземплярами общих указателей, и я понимаю, что сами по себе не являются потокобезопасными, но если выше это действительно потокобезопасно, это очень похоже на потокобезопасный shared_ptr
, и я не знаю, понять, как две строки кода, как в условном выше, могут быть сделаны атомами без блокировок.
* "это очень похож на Потокобезопасную' shared_ptr '' * - Использует shared-'shared_ptr', чтобы построить 'weak_ptr' действительно поточно-безопасный? – Holt
Нет ничего, что остановило бы реализацию от использования мьютекса, чтобы сделать 'lock' атомом, за исключением того, что он не будет очень эффективным. – Oktalist