Джон, поддерживаю
ary, довольно просто тело цикла и операция сравнения не атомарны это значит, что ядро может отдать квант времени посреди сравнения или вычитания
например оба потока в начале сравнения
a=1
один из потоков проверяет условие и проходит дальше т.к. a>0
и не дойдя до a = a - 1 у него отбирают управление и отдают другому потоку
другой поток тоже проверяет условие и тоже a>0
и оба зашли в тело
можно предположить что оба из них вычтут из a еденицу
и a будет равно -1
но если один поток остановлен как раз перед обновлением значения
а второй поток его обгоняет и делает сам обновление
в a ляжет 0 тут просыпается второй поток который уверен, что a не изменилось пока он спал и тоже записывает туда 0
на выходе из цикла ты имеещь
2 прохода по телу цикла, но изменение a на 1
если ты a внесёшь в тело функции, то неопределёность исчезнет
в общем, цепь простых рассуждений даёт ответ на кучу вопросов
