Как понять атомарность в автономной реализации C или C ++?

C11 и C ++ 11 определяют атомику в терминах потоков выполнения. В то время как в размещенной среде ясно, что такое поток, это довольно расплывчатый термин в автономной реализации языка.

  1. Как формально понять атомарность, указанную в C11 и C ++ 11 в автономной реализации, где все потоки должны быть реализованы внутри программы? Например: ISR — это отдельный поток выполнения?
  2. Почему стандартные комитеты определяют атомику в терминах потоков, а не просто в области упорядочения кода?
  3. Есть ли какие-либо встроенные компиляторы, уже поддерживающие атомарность C11 / C ++ 11, кроме gcc?

5

Решение

Мой несколько механистический (и несколько ручной) подход к этому типу вопросов состоит в том, что атомарные операции гарантируют три вещи: чтение и запись не будут порваны переключением контекста (поэтому вы видите только те значения, которые фактически были сохранены в переменной); кеши сбрасываются (поэтому вы не видите устаревших значений); и компилятор не может перемещать инструкции между атомарными операциями (таким образом, операции, которые логически происходят до атомарного доступа, на самом деле происходят до этого доступа). Обратите внимание, что я попытался избежать какого-либо понятия «нить» здесь, хотя это немного затруднено.

Если вы пишете свой собственный механизм потоков, эти свойства, очевидно, важны. Они ортогональны деталям механизма потоков, который вы используете.

Что касается обработчиков сигналов, они дают вам возможность встать, когда вам нужно проверить значения из кода, выполняемого в обработчике сигналов, и когда обработчик сигналов должен изменить значения, которые заботит остальная часть программы.

Я не уверен, что стандарт формально обращается к ISR (уверен, что нет), но с этой механистической точки зрения ISR ничем не отличается от сигнала, который не приходит от вызова к raise, Это просто асинхронный вызов функции, и он занимает пространство стека, которое он получает из потока, который прерывается. Это определенно не Тема; это паразит в существующей теме. Так что для ISR я бы пошел с гарантиями для сигналов, а не с гарантиями для потоков.

3

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

Атомика должна иметь дело с условиями гонки, поэтому без нитей они практически не имеют смысла. Единственный другой контекст, в котором могут происходить гонки, — это обработчики сигналов, и там стандарт C предлагает концепцию свободы от блокировки.

В таком случае нет разницы между автономной и размещенной средой. Потоки и атомарность являются необязательными функциями, и если автономная среда поддерживает оба, она должна соответствовать спецификации обоих. Если он поддерживает только атомарность, он может обеспечить атомарные типы без блокировки для обработчиков сигналов, но другие атомарные типы тогда бесполезны.

3

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector