Должен ли я блокировать mutex одной переменной?

Если одна 32-разрядная переменная распределяется между несколькими потоками, я должен установить блокировку мьютекса вокруг переменной? Например, предположим, что 1 поток записывается на 32-разрядный счетчик, а второй поток читает его. Есть ли вероятность, что 2-й поток может прочитать поврежденное значение?

Я работаю над 32-битной встроенной системой ARM. Кажется, что компилятор выравнивает 32-битные переменные, чтобы их можно было читать или писать с помощью одной команды. Если 32-битная переменная не была выровнена, то чтение или запись будут разбиты на несколько инструкций, а второй поток может прочитать поврежденное значение.

Изменяется ли ответ на этот вопрос, если я перейду к многоядерной системе в будущем, и переменная будет разделяться между ядрами? (предполагая общий кэш между ядрами)

Спасибо!

Ответ 1

Мьютекс защищает вас от более чем разрывания - например, некоторые реализации ARM используют исполнение вне порядка, а мьютекс будет включать в себя ограничения памяти (и компилятора), которые могут потребоваться для правильности вашего алгоритма.

Безопаснее включать мьютекс, затем выяснить способ его оптимизации позже, если он показывает как проблему с производительностью.

Обратите также внимание, что если ваш компилятор основан на GCC, у вас может быть доступ к GCC atomic builtins.

Ответ 2

Если все записи выполняются из одного потока (т.е. другие потоки только считывают), то нет, вам не нужен мьютекс. Если вы можете писать более одного потока, тогда вы делаете.

Ответ 3

Вам не нужен мьютекс. В 32-битной ARM одиночная запись или чтение - это атомная операция. (независимо от количества ядер) Конечно, вы должны объявить эту переменную как изменчивую.

Ответ 4

В 32-битной системе чтение и запись 32-разрядных варов являются атомарными. Однако это зависит от того, что вы делаете с переменной. Например. если вы каким-то образом манипулируете им (например, добавьте значение), тогда для этого требуется чтение, манипуляция и запись. Если CPU и компилятор не поддерживают атомную операцию для этого, вам необходимо будет использовать мьютекс для защиты этой последовательности многоопераций.

Существуют и другие методы без блокировки, которые могут уменьшить необходимость в мьютексах.