Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Общие вопросы > Что применяют от "deadlock'ов"? |
Автор: xTr1m 23.5.2013, 14:10 | ||
Подскажите пожалуйста, какой прием применяется в таком случае (псевдокод)
то есть может быть ситуация, когда второй поток успеет захватить мьютекс_3 до того, как это сделает поток_1 и будет deadlock. Или против таких случаев только нужно на уровне архитектуры что-то предпринимать? |
Автор: fish9370 23.5.2013, 14:32 |
если эти мьютексы логически связаны, то и захватывать их нужно в строго определенном порядке |
Автор: xTr1m 23.5.2013, 14:35 |
нет, ну допустим, что потоку_1 нужно сразу все три ресурса (и их мьютексы соответственно). а потоку_2 сначала нужен ресурс_3, а потом ресурс_1. или этим приходится жертвовать и тогда захватывать во все потоках в одинаковом порядке. но это как ведь не очень, постоянно это помнить, расширять, сопровождать сложно. |
Автор: fish9370 23.5.2013, 14:37 |
такова суровая реальность, по другому никак |
Автор: xTr1m 23.5.2013, 15:13 | ||
нет, я имел в виду случай, когда поток_1 использует все три ресурса одновременно, а поток_2 по очереди
или получается, что нужно стараться делать так, чтобы можно было захватить / отредактировать / освободить? |
Автор: bsa 23.5.2013, 16:05 | ||
![]() |
Автор: xTr1m 23.5.2013, 16:09 |
ну что же, большое спасибо, буду знать. |
Автор: Alexeis 23.5.2013, 16:25 |
Если поток не смог захватить 3 одновременно, то он должен освободить все 3 и потом повторно попытаться их захватить. В винде есть функция WaitForMultipleObjects . Она позволяет захватывать одновременно группу объектов. Не по одиночке, а сразу группу. |
Автор: NoviceF 23.5.2013, 19:08 | ||
Как вариант, во второй функции можно захватывать 3й мьютекс, делайть трайлок первого, если он занят - освобождать 3й мьютекс и повторять попытку через время, опять начиная с захвата 3го мьютекса. |