Счет явно должен быть защищен мьютексом или другим механизмом синхронизации.
На фундаментальном уровне статус count ++ разбивается на:
load count into register
increment register
store count from register
Переключение контекста может произойти до / после любого из этих шагов, что приводит к ситуациям, подобным:
Thread 1: load count into register A (value = 0)
Thread 2: load count into register B (value = 0)
Thread 1: increment register A (value = 1)
Thread 1: store count from register A (value = 1)
Thread 2: increment register B (value = 1)
Thread 2: store count from register B (value = 1)
Как видите, оба потока завершили одну итерацию цикла, но в результате счетчик увеличился только один раз.
Возможно, вы также захотите сделать счет изменяемым, чтобы заставить нагрузки и хранилища переходить в память, поскольку хороший оптимизатор, скорее всего, будет вести подсчет в регистре, если не указано иное.
Кроме того, я хотел бы предположить, что если это все, что будет сделано в ваших потоках, производительность резко упадет из-за всех блокировок / разблокировок мьютекса, необходимых для поддержания ее согласованности. Потоки должны иметь гораздо большие рабочие единицы для выполнения.