C ++ читает и записывает int Atomic? - PullRequest
77 голосов
/ 10 сентября 2008

У меня есть две темы, одна обновляет int, а другая читает. Это статистическое значение, при котором порядок операций чтения и записи не имеет значения.

У меня вопрос: нужно ли в любом случае синхронизировать доступ к этому многобайтовому значению? Или, другими словами, может ли часть записи завершиться и прерваться, и тогда произойдет чтение.

Например, представьте значение = 0x0000FFFF, которое получает увеличенное значение 0x00010000.

Есть ли время, когда значение выглядит как 0x0001FFFF, о котором мне следует беспокоиться? Конечно, чем больше размер шрифта, тем больше вероятность того, что это произойдет.

Я всегда синхронизировал эти типы доступа, но мне было любопытно, что думает сообщество.

Ответы [ 15 ]

0 голосов
/ 31 июля 2010

Давайте возьмем этот пример

int x;
x++;
x=x+5;

Первый оператор считается атомарным, поскольку он преобразуется в одну директиву сборки INC, которая занимает один цикл ЦП. Однако для второго назначения требуется несколько операций, поэтому это явно не атомарная операция.

Другой, например,

x=5;

Опять же, вам нужно разобрать код, чтобы увидеть, что именно здесь происходит.

0 голосов
/ 09 мая 2010

Единственный переносимый способ - это использовать тип sig_atomic_t, определенный в заголовке signal.h для вашего компилятора. В большинстве реализаций C и C ++ это int. Затем объявите вашу переменную как "volatile sig_atomic_t."

0 голосов
/ 12 сентября 2008

Помогите из упомянутой выше проблемы с кешем ...

Если вы переносите код на процессор с меньшим размером регистра, он больше не будет атомарным.

ИМО, проблемы с потоками слишком острые, чтобы рисковать.

0 голосов
/ 10 сентября 2008

Я согласен со многими и особенно Джейсон . В Windows можно использовать InterlockedAdd и его друзей.

0 голосов
/ 10 сентября 2008

Нет, они не (или, по крайней мере, вы не можете предположить, что они есть). Сказав это, есть некоторые приемы, чтобы сделать это атомарно, но они обычно не переносимы (см. Сравнение и замена ).

...