ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Вторник
3 декабря
1280268 Топик полностью
vpv.vpv (31.01.2023 12:11, просмотров: 259) ответил Nikolay801_ на По моему на всех актуальных платформах инкремент делается через чтение-модификацию-запись, то есть не атомарно по определению. Но применительно к очереди в большинстве реализаций инкременты хвоста и головы происходят в очень разных местах и споткнуться о неатомарность не получится.
Споткнуться очень получится. Например, я выгреб из буфера 10 байт, и хочу уменьшить счётчик. Он равен 15. Читаю его, отнимаю 10, получаю 5, и... В этот момент, проц отвлекается на прерывание, в котором принимается байт и счётчик увеличивается на 1, становится 16. После возврата из П/П я пишу в него 5. Или двухбайтная голова, к примеру, равна 0x00FF. Читаю младший байт, 0xFF. В этот момент летит прерывание, и голова становится равной 0x0100. Читаю старший байт, он уже 0x01. В 

итоге, получаю голову, равную... 0x01FF !!! .Выход прост, для атомарности манипуляций надо просто запрещать прерывания.