стандартный говорит:
shared_ptr<T> lock() const noexcept;
Возвращает:
expired() ? shared_ptr<T>() : shared_ptr<T>(*this).
но между истекшим сроком, возвращающим false (объект все еще существует) и конструкцией shared_ptr, другой поток может удалить последнюю сильную ссылку, бросая тем самым
неожиданное исключение? как это предотвратить?
или я что-то пропустил?
Вам не нужно это предотвращать, об этом заботится реализация стандартной библиотеки.
Приведенный код предназначен только для иллюстрации: поведение lock()
как этот код, но атомарно по отношению к другим потокам.
Если вы хотите знать, как это делается, вы можете посмотреть исходный код. Это шаблонный класс, поэтому код обязательно будет в заголовочных файлах. Но будьте осторожны! Стандартный исходный код библиотеки C ++ не для слабонервных.
Других решений пока нет …