turn = (1-mine)
относительно легко объяснить. Допустим, поток 0 (тот, где mine
установлен на 0
) имеет критическую секцию. Когда он закончится, он установит turn
в 1 - mine
или 1, чтобы запустить другой поток.
Когда поток 1 (тот, где mine
установлен на 1
) имеет критическую секцию. Когда он закончится, он установит turn
в 1 - mine
или 0, что позволит запустить другой поток.
На самом деле это система передачи токенов, где каждый поток позволяет запускать другой, устанавливая переменную.
Основным недостатком чего-то подобного является то, что является системой передачи токенов. Он плохо масштабируется для большего количества потоков, поскольку токен всегда передается определенному потоку.
Например, предположим, что поток 0 завершил работу с токеном, поэтому для turn
установлено значение 1. Но поток 1 отключен для выполнения интенсивных вычислений, и не требуется токен прямо сейчас.
Но потоку 2 нужен токен, так как он хочет выполнить некоторую работу над критическим разделом. Он должен ждать, пока поток 1 не передаст ему токен, не очень хорошая ситуация.
Но на самом деле это даже проблема для двух потоков. После того, как вы прошли токен, вы не можете повторно войти в критический раздел, пока другой поток не вернет вам токен, независимо от того, действительно ли он ему нужен.