У меня есть следующий сценарий,
class enum class Status {
Unknown, Pause, Normal, Resume
}
std::unordered_map<int, Status> status_map;
Если в начале я знаю весь ключ в status_map и initialze,
for(auto key:key_list) {
status_map[key]=Status::Unknown;
}
Затем позже thread1
изменит статус известного ключа, а thread2
будет продолжать читать status_map
, чтобы принять какое-то решение, будет ли вся эта операция потокобезопасной?
В двух словах: нет.
Представьте, что ваши потоки выполняются на разных ядрах, и каждое ядро кэширует карту в своем собственном кеше. Еще хуже: каждое ядро будет кэшировать часть карты. Нет никакой гарантии, что ваш поток чтения увидит согласованные значения, которые обновляет поток записи. Вам все еще нужно, чтобы значения были атомарными:
std::unordered_map<int, std::atomic<Status>> status_map;
Без атомов поведение не определено. Используя atomics, вы все равно можете расслабить модель памяти, если вам не нужна полная синхронизация, но, по крайней мере, будут некоторые гарантии.