|
std::shared_ptr<T> Get() const { |
|
const short index = current_.load(std::memory_order_relaxed); |
|
return ptrs_[index]; |
|
} |
Формально, чтение ptrs_ не синхронизировано с записью в терминах memory model, поэтому имеем UB.
При исполнении возможны различные гонки между чтением и записью.
Как гонка возникает:
- чтение
current_ не гарантирует видимость последнего в mo значения, так что можно вычитать старый индекс, обозначающий текущий слот записи.
- после считывания актуального индекса копирование может быть отложено (например, вытеснением), до момента записи в слот.
Копирование std::shared_ptr<> может быть реализовано следующим образом:
- Скопировать указатель на объект.
- Скопировать указатель на блок.
- Если блок есть, увеличить счётчик.
Варианты гонок:
- копирование старого указателя на объект и нового указателя на блок, или наоборот.
- обращение к удалённому блоку.
- e.t.c.
userver/universal/include/userver/utils/swappingsmart.hpp
Lines 25 to 28 in 407c685
Формально, чтение
ptrs_не синхронизировано с записью в терминах memory model, поэтому имеем UB.При исполнении возможны различные гонки между чтением и записью.
Как гонка возникает:
current_не гарантирует видимость последнего вmoзначения, так что можно вычитать старый индекс, обозначающий текущий слот записи.Копирование
std::shared_ptr<>может быть реализовано следующим образом:Варианты гонок: