Я наткнулся на этот пост, потому что у меня было подобное требование. Или, по крайней мере, я так и думал.
Мой страх заключался в том, что если бы блокировки не были выпущены в порядке FIFO, может произойти голодное голодание, и это было бы ужасно для моего программного обеспечения.
Прочитав немного, я уволил свои страхи и понял, что все говорят: если вы этого хотите, вы делаете это неправильно. Кроме того, я был убежден, что вы можете полагаться на ОС, чтобы выполнять свою работу, и не позволять вашему потоку голодать.
Чтобы добраться до этого, я немного поработал, чтобы лучше понять, как блокировки работали под Linux , Я начал с того, что посмотрел на исходный код glibc и спецификации pthreads (Posix Threads), потому что я работал на C ++ в Linux. Я не знаю, использует ли Python pthreads под капотом, но я предполагаю, что это возможно.
Я не нашел какой-либо спецификации в нескольких ссылках на pthreads, относящихся к порядку разблокируется.
Я нашел: блокировки в pthreads в Linux реализованы с использованием функции ядра, называемой futex .
http: // man7 .org / linux / man-pages / man2 / futex.2.html
http://man7.org/linux/man-pages/man7/futex.7. html
Ссылка на ссылки на первую из этих страниц приводит к этому PDF:
https://www.kernel.org/doc /ols/2002/ols2002-pages-479-495.pdf
Это немного объясняет стратегии разблокировки и о том, как futexes работают и реализуются в ядре Linux, и много больше.
И там я нашел то, что хотел. В нем объясняется, что futexes реализованы в ядре таким образом, что разблокировки в основном выполняются в порядке FIFO (для повышения справедливости). Тем не менее, это не гарантируется, и возможно, что один поток может немного перепрыгнуть линию. Они позволяют это не слишком усложнять код и позволяют достичь хорошей производительности, не теряя его из-за крайних мер по обеспечению соблюдения порядка FIFO.
Итак, в основном, у вас есть:
Стандарт POSIX не налагает никаких требований относительно порядка блокировки и разблокировки мьютексов. Любая реализация может делать так, как они хотят, поэтому, если вы полагаетесь на этот порядок, ваш код не будет переносимым (даже между разными версиями одной и той же платформы).
Реализация Linux в библиотеке pthreads основана на функции / методе futex, которая реализует мьютексы, и в основном пытается сделать разблокировку мьютексов в стиле FIFO, но не гарантирует, что это будет сделано в этом порядке.