Этот код не гарантируется поточно-ориентированным на Win32, поскольку Win32 гарантирует атомарность только для правильно выровненных 4-байтовых значений и значений указателя. bool
не гарантированно будет одним из этих типов. (Обычно это однобайтовый тип.)
Для тех, кто требует фактического примера того, как это может потерпеть неудачу:
Предположим, что bool
является однобайтовым типом. Предположим также, что ваша переменная is_true
хранится рядом с другой переменной bool
(назовем ее other_bool
), так что обе они используют одну и ту же 4-байтовую строку. Для конкретности предположим, что is_true
находится по адресу 0x1000, а other_bool
- по адресу 0x1001. Предположим, что оба значения изначально false
, и один поток решает обновить is_true
, в то время как другой поток пытается обновить other_bool
. Может произойти следующая последовательность операций:
- Поток 1 готовится установить
is_true
в true
, загрузив 4-байтовое значение, содержащее is_true
и other_bool
. Тема 1 читает 0x00000000.
- Поток 2 готовится установить
other_bool
в true
, загрузив 4-байтовое значение, содержащее is_true
и other_bool
. Тема 2 читает 0x00000000.
- Поток 1 обновляет байт в 4-байтовом значении, соответствующем
is_true
, создавая 0x00000001.
- Поток 2 обновляет байт в 4-байтовом значении, соответствующем
other_bool
, создавая 0x00000100.
- Поток 1 сохраняет обновленное значение в памяти.
is_true
сейчас true
и other_bool
сейчас false
.
- Поток 2 сохраняет обновленное значение в памяти.
is_true
сейчас false
и other_bool
сейчас true
.
Обратите внимание, что в конце этой последовательности обновление до is_true
было потеряно, поскольку оно было перезаписано потоком 2, который захватил старое значение is_true
.
Так получилось, что x86 очень прощает ошибки такого типа, потому что поддерживает байт-гранулярные обновления и имеет очень ограниченную модель памяти. Другие процессоры Win32 не так просты. Например, микросхемы RISC часто не поддерживают байт-гранулярные обновления, и даже если они это делают, у них обычно очень слабые модели памяти.