Вопрос
Учитывая атомарный compare-and-swap
в качестве примитива, можно ли атомарно записывать в разные места памяти?То есть, например:
// initialization
mem[0] = 0;
mem[1] = 0;
// thread A runs
mem[0] = 1;
mem[1] = 1;
// thread B runs
int x = mem[0];
int y = mem[1];
printf("%d %d", x, y);
Здесь поток B может выводить 0, 0
, если он работает до A, 1, 1
, если он выполняется после A, и 1, 0
, если он выполняется междудва утверждения А. Я хочу избежать случая 1, 0
, атомарно написав mem[0] = 1
и mem[1] = 1
.
То, что я пробовал
Очевидно, у меня мог бы быть семафор для блокировки индексов 0,1 в этом очень специфическом случае, но
- это требует дополнительной памяти,
- это не позволяет мне писать произвольное число индексов.
Интересно, можно ли добиться эффекта без дополнительной памяти.