Мой учебник описывает тупик, как показано на рисунке ниже:
![enter image description here](https://i.stack.imgur.com/950y2.jpg)
, где s
и t
- семафоры, а
void P(sem_t *s); /* Wrapper function for sem_wait */
void V(sem_t *s); /* Wrapper function for sem_post */
Я могу понять, как это работает, если поток входит в область тупика, он не может прогрессировать дальше и застревает навсегда. И в учебниках говорится о правиле упорядочения замков Mutex:
Программа свободна от тупиков, если для каждой пары мьютексов (s, t) в программе каждый поток, содержащий одновременно s и t, блокирует их в одном и том же порядке.
Например, мы можем исправить тупик, сначала заблокировав s, а затем
каждая нить. На рисунке ниже показан график прогресса:
![enter image description here](https://i.stack.imgur.com/0pAm4.jpg)
Но у меня просто может быть быстрое исправление, я не уверен, что я прав:
мы можем просто добавить некоторые тривиальные операторы, такие как одиночные ;
или int test = 0
между операциями P и V, что создаст вертикальный разрыв между двумя запрещенными областями, так что потоки могут в конечном итоге пройти через разрыв, как показано на рисунке ниже :
![enter image description here](https://i.stack.imgur.com/cHX6r.png)
Является ли мой подход технически правильным?