Могу ли я использовать volatile sig_atomic_t, чтобы избежать мьютекса в C ++ 03?

Если я нахожусь на оборудовании с поддержкой атомарного чтения и увеличения / уменьшения, могу ли я использовать volatile sig_atomic_t в C ++ 03, чтобы получить доступ к элементарным операциям и избежать полноценного мьютекса, или я должен ждать C ++ 11 и std::atomic<int>?

1

Решение

Немного компиляторы предоставляют нестандартную семантику для volatile что позволило бы это работать, но это не переносимо. volatile для доступа к оборудованию, не для связи между потоками. Там нет никакой гарантии, что написать в volatile переменная одного потока когда-либо станет видимой другому потоку — для связи между потоками вам нужны синхронизирующие операции, такие как барьеры памяти, которые предоставляются операциями над std::atomic типы.

Для получения дополнительной информации см. «изменчивый против изменчивый» и документ Ханса Бома по ISO C ++ «Должен ли volatile получить атомарность и семантику видимости потока?» (обе ссылки взяты из сноски на недавний Сообщение в блоге Херба Саттера)

Вам не нужно ждать поддержки C ++ 11 в вашем компиляторе, хотя большинство платформ предоставляют некоторые специфичные для платформы атомарные операции, которые также включают в себя любые необходимые барьеры памяти, например ССЗ __sync встроенные, атомарные операции Solaris или блокированные функции Win32. Есть также переносимые библиотеки, такие как предлагаемый Boost.Atomic которые предоставляют общий интерфейс для реализаций платформы.

5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]