Предположим, я хотел реализовать собственный std :: атомный тип (конечно, я не хочу, я только прошу из любопытства). Как реализовать метод загрузки? Мое предположение было бы что-то вроде следующего (m_mutex
это мьютекс используется для блокировки операций и m_object
объект, атомное в настоящее время проводит):Как можно реализовать std :: atomic :: load
T& load() {
std::lock_guard<std::mutex> lck(m_mutex);
return m_object;
}
Очевидно, что это не будет работать, потому что при вызове a.load().doSomething()
призыв к doSomething
не будет защищен, потому что m_object
уже возвращается с load
и не охраняется lock_guard.
Я хотел бы задать два вопроса:
- Как бы один реализовать правильную версию нагрузки?
- Что было бы простой техникой для реализации
load
не с мьютексом, а с блокировкой datastructure?
Он будет использовать специальные инструкции и функции для конкретных целей и процессоров. –
Вы имеете в виду встроенный код сборки при реализации std :: atomic? Просто очень упрощено, как это будет выглядеть? – user2683038
Либо встроенная сборка, либо встроенные функции внутри компилятора. –