В многопоточных программах размещайте все обращения к общим изменяемым данным внутри критических секций, синхронизированных объектом std::mutex, общим для этих данных. Каждая операция внутри критической секции является атомарной операцией. Без промедления снимайте блокировку, когда она больше не нужна.