Если я нахожусь на оборудовании с поддержкой атомарного чтения и увеличения / уменьшения, могу ли я использовать volatile sig_atomic_t
в C ++ 03, чтобы получить доступ к элементарным операциям и избежать полноценного мьютекса, или я должен ждать C ++ 11 и std::atomic<int>
?
Немного компиляторы предоставляют нестандартную семантику для volatile
что позволило бы это работать, но это не переносимо. volatile
для доступа к оборудованию, не для связи между потоками. Там нет никакой гарантии, что написать в volatile
переменная одного потока когда-либо станет видимой другому потоку — для связи между потоками вам нужны синхронизирующие операции, такие как барьеры памяти, которые предоставляются операциями над std::atomic
типы.
Для получения дополнительной информации см. «изменчивый против изменчивый» и документ Ханса Бома по ISO C ++ «Должен ли volatile получить атомарность и семантику видимости потока?» (обе ссылки взяты из сноски на недавний Сообщение в блоге Херба Саттера)
Вам не нужно ждать поддержки C ++ 11 в вашем компиляторе, хотя большинство платформ предоставляют некоторые специфичные для платформы атомарные операции, которые также включают в себя любые необходимые барьеры памяти, например ССЗ __sync
встроенные, атомарные операции Solaris или блокированные функции Win32. Есть также переносимые библиотеки, такие как предлагаемый Boost.Atomic которые предоставляют общий интерфейс для реализаций платформы.
Других решений пока нет …