En general para dar prioridad tenés que esperar a que el proceso con prioridad altere de alguna forma el estado del sistema para avisar que está esperando. El estar esperando en un semáforo no cambia el estado global del sistema porque no hay forma de saber que está ahí con las herramientas que vemos en el curso. Si tuvieras una API de semáforos que te permitiera saber cuantos procesos están esperando por adquirir un semáforo podrías hacerlo mejor. De hecho esto si lo tenés en ADA con el count de los entries por lo que en ese caso se espera que tengas esto en cuenta y evites esta situación.
Por último, el problema no es que los semáforos no sean FIFO porque con monitores (o mailbox) te puede pasar lo mismo si el escritor debe entrar al monitor para levantar una bandera indicando que llegó y hay 400 lectores encolados en el monitor tratando de entrar antes que él.