Я разрабатываю многопоточный алгоритм, в котором требование состоит в том, чтобы прочитать последнее значение общей переменной. Запись в переменную является атомарной (с использованием сравнения и замены). Однако чтения не являются атомарными.атомные записи и изменчивые чтения
Рассмотрим следующий пример:
//Global variable
int a = 10;
// Thread T1
void func_1() {
__sync_bool_compare_and_swap(&a, 10, 100);
}
// Thread T2
void func_2() {
int c = a;
/* Some Operations */
int b = a;
/* Some Operations */
}
Если код int b = a
выполняется (по Thread Т2) после того, как __sync_bool_compare_and_swap
в func_1 (по нити T1), то согласно моему пониманию, он все еще не гарантировано читать последнее значение «variable a», поскольку компилятор может кэшировать «a» и использовать старое значение «a».
Теперь, чтобы избежать этой проблемы, я объявил переменную «летучий», как показано ниже:
volatile int a = 10;
// Thread T1
void func_1() {
__sync_bool_compare_and_swap(&a, 10, 100);
}
// Thread T2
void func_2() {
volatile int c = a;
/* Some Operations */
volatile int b = a;
/* Some Operations */
}
Для того же сценария выполнения int b = a
посредством резьбы T2 после __sync_bool_compare_and_swap
ниткой Т1 закончится, он гарантированно прочитайте последнее значение «a»?
Каким образом согласованность когерентности и модель согласованности памяти влияют на изменчивое чтение после атомной записи?
Можете ли вы использовать C++ 11 и 'std :: atomic'? –
Jarod42
Взгляните на: http://lxr.oss.org.cn/source/Documentation/memory-barriers.txt – Malkocoglu
@ Jarod42 Использование std :: atominc решит проблему, но я пытаюсь понять, что произойдет, если волатильное чтение следует за атомной записью. –