Является ли int безопасным для чтения из нескольких потоков?
У меня есть несколько потоков, считывающих одну и ту же переменную int. и один поток записывает значение.
меня не волнует состояние гонки.
только моя забота-писать и читать значение int в то же время является безопасной памятью ?
и это не приведет к краху приложения .
3 ответов
Да, все должно быть в порядке. Только так я могу представить, что сбой, если один из потоков освобождает память-то целое. Для достижения наилучших результатов я бы также убедился, что целые числа выровнены по sizeof(int)
границы. (Некоторые процессоры вообще не могут получить доступ к целым числам без этого выравнивания. Другие обеспечивают более слабые гарантии атомарности для неравномерного доступа.)
Да, на x86 и x86-64, если значение, которое Вы читаете, выровнено правильно. 32-бит int
s, они должны быть выровнены по 4-байтовой границе, чтобы доступ был атомные при чтении или письме, что почти всегда будет иметь место, если вы не будете изо всех сил создавать unaligned int
s (скажем, используя упакованную структуру или выполняя арифметику приведения/указателя с байтовыми буферами).
вы, вероятно, также хотите объявить свой переменная volatile
таким образом, компилятор будет генерировать код, который будет повторно извлекать переменную из памяти каждый раз, когда к ней обращаются. Это предотвратит его оптимизацию, такую как кэширование в регистре, когда он может быть изменен другим потоком.
на всех платформах Linux, о которых я знаю, чтение и запись выровненных int являются атомарными и безопасными. Вы никогда не будете читать значение, которое не было написано (без разрыва слова). Вы никогда не будете причиной ошибки или аварии.