Я не могу полностью проверить это или найти все вспомогательные ссылки в данный момент, но вот несколько замечаний ...
Во-первых, документация для QSemaphore.tryAcquire указывает, что значение тайм-аута составляет миллисекунды , а не секунды. Таким образом, ваши потоки ожидают освобождения ресурса всего 1 миллисекунду.
Во-вторых, я вспоминаю, как где-то читал (к сожалению, не помню где) обсуждение того, что происходит, когда несколько потоков пытаются получить один и тот же ресурс одновременно. Хотя поведение может варьироваться в зависимости от ОС и ситуации, казалось, что типичным результатом является то, что он является общедоступным, и ни одному потоку не предоставляется более высокий приоритет, чем другому. Таким образом, поток, ожидающий получения ресурса, будет иметь такой же шанс получить его, как и поток, который только что выпустил его и пытается немедленно повторно получить его. Я не уверен, что настройка приоритета потока повлияет на это.
Итак, почему вы можете получить разные результаты для QSemaphore и QMutex? Ну, я думаю, что семафор может быть более сложным системным ресурсом, который потребует больше времени для получения и выпуска, чем мьютекс. Недавно я сделал несколько простых временных интервалов для мьютексов и обнаружил, что в среднем на блокировку или разблокировку уходит около 15-25 микросекунд. В течение 1 миллисекунды, которую ожидают ваши потоки, это будет не менее 20 циклов блокировки и разблокировки, и шансы одного и того же потока всегда повторно захватывать блокировку в это время невелики. Ожидающий поток, скорее всего, получит хотя бы один кусочек от яблока за время ожидания, поэтому при использовании мьютексов в вашем примере вы, скорее всего, не увидите никаких ошибок получения.
Однако, если освобождение и приобретение семафора занимает гораздо больше времени (я не рассчитал их, но я предполагаю, что они могут), то более вероятно, что вы могли бы случайно получить ситуацию, когда один поток может продолжайте повторно запрашивать ресурс, пока не закончится условие ожидания для ожидающего потока.