Везде, где я читаю, я вижу сильные рекомендации не использовать ослабленный порядок памяти, мне интересно, является ли следующий фрагмент кода одним из исключений, в которых это будет работать, или есть какие-то последствия, которых я не вижу.
class SessionHolder {
public:
void set_session(std::shared_ptr<Session> session) {
std::atomic_store_explicit(&_session, session, std::memory_order_relaxed);
}
std::shared_ptr<Session> get_session() const {
return std::atomic_load_explicit(&_session, std::memory_order_relaxed);
}
private:
std::shared_ptr<Session> _session;
};
В принципе, когда я делаю get_session
, мне все равно, какой сеанс я получаю, если это сеанс или nullptr.Но если другой поток хранит данные (что случается редко), я бы хотел получить это значение в разумные сроки.
- Как я понимаю, даже не гарантируется, что я получу это значениепросто я получу значение, которое хранилось там в какой-то момент времени, но я всегда мог получить nullptr.
- На практике, кажется, работает, могу ли я ожидать, что оно завершится ошибкой (всегда получая nullptr) в некоторыхситуации / платформу конкретно?
- Можно ли настроить порядок памяти в операции хранилища только для того, чтобы это исправить?Например,
memory_order_release
будет распространять изменения в другой поток?
Дополнительные сведения о том, как используется этот класс:
По сути, у меня есть какой-то видпоток, который непрерывно производит данные.В определенный момент клиентский процесс может подключиться (запустить сеанс) и начать прослушивание этих данных.Поток производителя непрерывно записывает в поток, если нет активного сеанса, данные отбрасываются, иначе отправляются клиенту.Другой поток, в определенный момент (не часто), когда клиент подключается, достигает этого потока и устанавливает сеанс.
Поток производителя должен иметь как можно меньше конфликтов, даже если это означает пропуск нескольких сообщений.