Безопасно ли читать int из нескольких потоков? - PullRequest
7 голосов
/ 28 сентября 2011

У меня несколько потоков, читающих одну и ту же переменную int. и один поток записывает значение.

Меня не волнует состояние гонки.

только мое беспокойство - это запись и чтение значения int одновременно, безопасна ли память?

и это не приведет к сбою приложения.

Ответы [ 3 ]

4 голосов
/ 28 сентября 2011

Да, все должно быть в порядке.Единственный способ предположить, что сбой, - это если один из потоков освобождает память, поддерживающую это целое число.Для достижения наилучших результатов я бы также удостоверился, что целые числа выровнены по границам sizeof(int).(Некоторые ЦП вообще не могут получить доступ к целым числам без такого выравнивания. Другие обеспечивают более слабые гарантии атомарности для неприровненного доступа.)

3 голосов
/ 28 сентября 2011

Да, на x86 и x86-64, если читаемое значение выровнено правильно.32-битные int с, они должны быть выровнены по 4-байтовой границе, чтобы при чтении или записи доступ был атомарный , что почти всегда будет иметь местоесли вы не сделаете все возможное, чтобы создать невыровненные int s (скажем, используя упакованную структуру или выполнив арифметику приведения / указателя с байтовыми буферами).

Возможно, вы также захотите объявить свою переменную как volatile, чтобы компилятор генерировал код, который будет повторно извлекать переменную из памяти при каждом обращении к ней.Это предотвратит его оптимизацию, такую ​​как кэширование в регистре, когда он может быть изменен другим потоком.

0 голосов
/ 28 сентября 2011

На всех известных мне платформах Linux чтение и запись выровненных целых чисел являются атомарными и безопасными. Вы никогда не будете читать значение, которое не было написано (без разрывов слов). Вы никогда не вызовете неисправности или сбоя.

...