Хоть один ответил (причем очень неплохо). Только давайте не спешить, для тех кто с этим не работал все не так уж очевидно
Имеется ввиду, что операция декремента не является атомарной.
Нет, хотя и это правильно. Такой код
C++ (Qt)
--count;
Также "not thread-safe". Почему? Процессор исполняет декремент примерно так (псевдокод)
1) загрузить переменную count в регистр
2) отнять от содержимого регистра 1
3) сохранить регистр в переменной (ячейке памяти)
Между 1-2 и/или 2-3 ОС имеет право "вытеснить поток", т.е. передать управление др нитке которая может работать с тем же count. Пример
- count было 5. Загрузили 5 в регистр и тут ОС передал управление
- для др нитки count тоже 5, она взяла и уменьшила его, теперь в ячейке 4
- теперь ОС вернул упр-е первой нитке. Но в регистре-то 5, отняли 1, записали, в ячейке 4
Итог: 2 раза отнимали от 5 единицу, должно быть 3, но имеем 4. Чтобы не размазывать каждый раз объяснения (типа кто там на регистре) говорят просто "операция не атомарна". Объявление переменной атомарной страхует от этой проблемы, напр
C++ (Qt)
QAtomicInt count(100);
...
--count;
Теперь если 100 раз отняли единичку, count будет четко ноль, хоть отнимали в одной нитке, хоть в 10, хоть как
Однако изначальный пример
C++ (Qt)
if (count > 0)
--count;
else
...
По-прежнему not thread-safe, объявление count как QAtomicInt не спасает