Это, прямо скажем, невероятно ужасно на типичном, реалистичном c оборудовании. Наиболее очевидная проблема заключается в следующем:
Посмотрите на поток в increment
. До запуска print
значение if
будет false
, а значение while
будет истинным. Прогнозирование ветвления начнет становиться твердо убежденным, что if
будет false
.
Затем, когда поток print
устанавливает switchFlag
в false
и вам нужно increment
для выполнения как настолько быстро, насколько это возможно, потому что другой поток будет ожидать его, вы выбираете наихудшую предсказуемую ветвь, которую только можно себе представить.
Итак, в тот самый момент, когда это наиболее критично, вы выполняете как можно быстрее, вы столкнуться с наихудшей производительностью, которую процессор может дать вам, взорвав все конвейеры с непредсказуемой ветвью.
Я настоятельно призываю вас не пытаться составлять сложные операции из примитивных операций, таких как загрузка атома c и магазины. Для этого требуется глубокая экспертиза платформы. Используйте высокоуровневые функции (например, мьютексы и условные переменные) для высокоуровневых операций (например, ожидания).
Но никогда не бывает хорошего способа реализовать два потока, которым необходимо чередовать выполнение. В любом случае, когда два потока не могут одновременно продвигаться вперед, нет веской причины иметь два потока.