Просто примечание:
Изменение значения одного слова обычно должно быть атомарным, если вы запускаете код на той же платформе, на которой вы его скомпилировали. Но есть еще кое-что, что делает использование атомарных инструкций обязательным (если вы даже не планируете использовать более сильные гарантии).
Причина в том, что помимо переупорядочения памяти на уровне компилятора у вас может быть переупорядочение на уровне ЦП для оптимизации. (записи не распространяются сразу на основную память, ЦП имеет буферы хранения и т. д.).
Таким образом, в многопоточной среде вам необходимо явно сделать изменения видимыми для всех ядер, иначе вы повредите память.
Что касается мутации составного типа, да, вам нужно быть (ОЧЕНЬ) осторожным. Самый простой способ - заблокировать весь объект (встраивание мьютекса - хороший способ сделать это, он более удобен для кэширования).
В противном случае, если вы хотите сделать это атомарно, вы можете принять методологию чтения-копирования-обновления (ищите RCU или копирование при записи), но ОСТОРОЖНО! Если вы действительно не знаете, что делаете, вы можете очень легко попасть в беду. Это сложно сделать, когда у вас есть изменяемые объекты, вложенные в другие изменяемые объекты (поиск проблем, связанных с линеаризуемостью вложенных структур данных без блокировки). Это действительно сложно, и я не одобряю этого. Даже если вы добавите дополнительный уровень косвенности, чтобы ваши структуры данных выглядели неизменяемыми, решение проблемы параллельных атомарных чтений, обновлений и удалений — это материал уровня доктора философии. Если вам интересно, найдите диссертацию и статьи Александра Прокопца: http://axel22.github.io/home/professional/
Вот почему каналы и мьютексы здесь для вас. И я ожидаю постепенного улучшения производительности по сравнению с уже хорошей производительностью каналов. Теперь каналы для некоторых даются легко, но мне потребовалось несколько дней, чтобы по-настоящему освоиться с ними. Но когда это сделано, использовать их очень просто.
person
Taye
schedule
19.11.2014
sync
/sync/atomic
, и если возникнут вопросы, мы здесь. - person twotwotwo   schedule 15.11.2014