слабая семантика ptr — std :: weak_ptr.lock в многопоточном переполнении стека

стандартный говорит:

shared_ptr<T> lock() const noexcept;

Возвращает:

expired() ? shared_ptr<T>() : shared_ptr<T>(*this).

но между истекшим сроком, возвращающим false (объект все еще существует) и конструкцией shared_ptr, другой поток может удалить последнюю сильную ссылку, бросая тем самым
неожиданное исключение? как это предотвратить?

или я что-то пропустил?

1

Решение

Вам не нужно это предотвращать, об этом заботится реализация стандартной библиотеки.

Приведенный код предназначен только для иллюстрации: поведение lock() как этот код, но атомарно по отношению к другим потокам.

Если вы хотите знать, как это делается, вы можете посмотреть исходный код. Это шаблонный класс, поэтому код обязательно будет в заголовочных файлах. Но будьте осторожны! Стандартный исходный код библиотеки C ++ не для слабонервных.

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]