Учитывая определение
int settings[N_STNGS];
std::atomic<size_t> current_settings(0);
и выполнение потока 1:
settings[new_settings] = somevalue; // line A
current_settings=new_settings; // line B
и выполнение потока 2:
int cur_settings = current_settings; // line X
int setting_value = settings[cur_settings]; // line Y
тогда да, если поток 2 в строке X читает new_settings
, записанный потоком 1 в строке B, и нет других модификаций settings[new_settings]
(по какому-то коду, которого мы не видим), поток 2 связан с прочитайте somevalue
, и не произойдет неопределенного поведения. Это происходит потому, что все операции (по умолчанию) memory_order_seq_cst
, а запись-отпускание (строка B) синхронизируется с операцией-чтение-чтение (строка X). Обратите внимание, что вам нужны два оператора в потоке 2, чтобы получить последовательность перед последовательностью между атомарным чтением индекса и чтением значения (вместо этого подойдет операция memory_order_consume
).
Я бы наверняка реализовал это с помощью rw-mutexes для запуска.