Вы должны понимать, что операция инкремента действительно эффективна:
read the value
add 1
write the value back
Вы должны спросить себя, что произойдет, если два из них произойдут в двух независимых потоках одновременно:
static int a = 0;
thread 1 reads a (0)
adds 1 (value is 1)
thread 2 reads a (0)
adds 1 (value is 1)
thread 1 writes (1)
thread 2 writes (1)
При двух одновременных приращениях вы можете видеть, что, возможно, один из них потерян, потому что оба потока читают предварительно увеличенное значение.
Пример, который вы привели, усложняется индексом статического цикла, который я сначала не заметил.
Поскольку это код на языке C ++, стандартная реализация состоит в том, что статические переменные видны всем потокам, поэтому для всех потоков существует только одна переменная подсчета циклов. Разумная вещь, которую нужно сделать, это использовать обычную автоматическую переменную, потому что каждый поток будет иметь свою собственную блокировку.
Это означает, что, хотя вы иногда теряете приращения, вы также можете получать их, потому что сам цикл может потерять счетчик и выполнять итерации дополнительного времени. В общем, отличный пример того, чего не следует делать.