Является ли int безопасным для чтения из нескольких потоков?

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

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

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

и это не приведет к краху приложения .

3 ответов


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


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

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


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