Взаимные блокировки
Оглавление
- Процессы и потоки в Qt
- QProcess – процессы в Qt
- QThread – потоки в Qt
- Приоритеты потоков в Qt
- Обмен сообщениями между потоками
- Сигнально-слотовые соединения
- Связь между потоками с помощью высылки событий
- Синхронизация
- QMutex — мьютексы в Qt
- QWaitCondition — условные ожидания в Qt
- Взаимные блокировки
- QSemaphore — семафоры в Qt
Работая с многопоточностью, нужно помнить о возможном возникновении тупиковых ситуаций, когда потоки могут заблокировать друг друга.
Представьте себе такую ситуацию, когда поток заблокировал ресурс А, а после работы над ним собирается работать с ресурсом В. Другой же поток заблокировал ресурс В и по окончании намеревается работать с ресурсом А. И вот один из потоков, закончив работу, обнаружил, что нужный ему ресурс заблокирован другим потоком. Он переходит в режим ожидания, надеясь дождаться разблокировки ресурса, но то же самое делает и другой поток. В итоге — оба ждут друг друга. Если ни один из этих потоков не освободит занятый им ресурс, то оба "зависнут" и не смогут продолжать свою работу дальше.
Это явление получило название взаимной блокировки (deadlock).
Существует множество решений такой проблемы. Например, можно так организовать работу потока, чтобы, в том случае, если поток не сможет получить доступ к необходимому ресурсу, он просто произвел бы освобождение занятых им ресурсов, а позже повторил попытку захвата необходимых ресурсов.
Читать далее: QSemaphore - семафоры в Qt