Есть несколько проблем с этим.
Во-первых, pthread_create
занимает много времени: безусловно, намного больше, чем быстрая итерация блокировки / приращения / разблокировки.Поэтому первый поток получает большое преимущество перед остальными, так как он выполняется первым, а второй получает меньшее преимущество и так далее.Когда вы вставляете printf
в цикл, это замедляет поток, поэтому преимущество меньше.
В связанной ноте, просто потому, что вернулось pthread_create
, поток не обязательно запустился.Это просто означает, что планировщик теперь будет учитывать это.
В-третьих, ваша реализация блокировки является занятым циклом ожидания.Следовательно, потребуется все доступное время ЦП для того, какой поток запущен.Поскольку вы выполняете свой код на одном ядре, если поток, которому принадлежит блокировка, приостанавливается, другие потоки будут тратить все свои сегменты времени на занятое ожидание, а затем поток с блокировкой может возобновить, разблокировать, попробовать и получитьснова блокировка.
Наконец, в случае конкуренции за блокировку, этот алгоритм отдает приоритет потоку с наименьшим номером, поэтому поток 0 получит блокировку больше, чем другие, так как все потоки делаютожидание занято, и, следовательно, существует высокий уровень конкуренции.
Попробуйте ввести в цикл 1011 * несколько вызовов в lock()
, чтобы поток с блокировкой имел больше шансов на запуск.