Можно ли во многих местах писать атомарно, используя только сравнение и обмен? - PullRequest
0 голосов
/ 26 мая 2018

Вопрос

Учитывая атомарный 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 в этом очень специфическом случае, но

  1. это требует дополнительной памяти,
  2. это не позволяет мне писать произвольное число индексов.

Интересно, можно ли добиться эффекта без дополнительной памяти.

...