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;
}
Является ли приведенный выше код потокобезопасным? Я прочитал этот ответ О потокобезопасности weak_ptr, но просто хотел убедиться что приведенный выше код является потокобезопасным.
Причина, по которой я спрашиваю об этом, заключается в том, что если приведенный выше код действительно является потокобезопасным, я не могу понять, как интерфейсы std::weak_ptr
и std::shared_ptr
делают следующую операцию атомарной expired() ? shared_ptr<T>() : shared_ptr<T>(*this)
. Мне просто кажется, что создание двух логических строк кода, как показано выше, невозможно сделать синхронным без использования какого-либо мьютекса или спин-блокировки.
Я понимаю, как атомарные приращения работают с разными экземплярами общих указателей, и я понимаю, что shared_ptr
сами по себе не являются потокобезопасными, но если приведенное выше действительно является потокобезопасным, это очень похоже на потокобезопасное shared_ptr
, и я не понимаю, как две строки код, как в условном выше, можно сделать атомарным без блокировок.
shared_ptr
. Является ли использование shared-shared_ptr
для созданияweak_ptr
действительно потокобезопасным? - person Holt   schedule 06.01.2017lock
атомарным, за исключением того, что это было бы не очень эффективно. - person Oktalist   schedule 06.01.2017