![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
xTr1m |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 692 Регистрация: 9.2.2005 Где: Москва Репутация: 1 Всего: 1 |
Подскажите пожалуйста, какой прием применяется в таком случае (псевдокод)
то есть может быть ситуация, когда второй поток успеет захватить мьютекс_3 до того, как это сделает поток_1 и будет deadlock. Или против таких случаев только нужно на уровне архитектуры что-то предпринимать? |
|||
|
||||
fish9370 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 15.4.2007 Где: Москва Репутация: -1 Всего: 1 |
если эти мьютексы логически связаны, то и захватывать их нужно в строго определенном порядке
-------------------- undefined |
|||
|
||||
xTr1m |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 692 Регистрация: 9.2.2005 Где: Москва Репутация: 1 Всего: 1 |
нет, ну допустим, что потоку_1 нужно сразу все три ресурса (и их мьютексы соответственно). а потоку_2 сначала нужен ресурс_3, а потом ресурс_1. или этим приходится жертвовать и тогда захватывать во все потоках в одинаковом порядке. но это как ведь не очень, постоянно это помнить, расширять, сопровождать сложно.
|
|||
|
||||
fish9370 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 15.4.2007 Где: Москва Репутация: -1 Всего: 1 |
такова суровая реальность, по другому никак
-------------------- undefined |
|||
|
||||
fish9370 |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 15.4.2007 Где: Москва Репутация: -1 Всего: 1 |
и все-таки тут кое-что нужно уточнить, если мы будем последовательно захватывать и освобождать мьютексы, то порядок не существеннет, но если захват вложенный, то необходимо вводить порядок
нет зависимости, нет дедлока -------------------- undefined |
||||
|
|||||
xTr1m |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 692 Регистрация: 9.2.2005 Где: Москва Репутация: 1 Всего: 1 |
нет, я имел в виду случай, когда поток_1 использует все три ресурса одновременно, а поток_2 по очереди
или получается, что нужно стараться делать так, чтобы можно было захватить / отредактировать / освободить? Это сообщение отредактировал(а) xTr1m - 23.5.2013, 15:16 |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
||||
|
||||
xTr1m |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 692 Регистрация: 9.2.2005 Где: Москва Репутация: 1 Всего: 1 |
ну что же, большое спасибо, буду знать.
|
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 12 Всего: 459 |
Если поток не смог захватить 3 одновременно, то он должен освободить все 3 и потом повторно попытаться их захватить. В винде есть функция WaitForMultipleObjects . Она позволяет захватывать одновременно группу объектов. Не по одиночке, а сразу группу.
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
NoviceF |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 313 Регистрация: 13.3.2012 Где: Ростов-на-Дону Репутация: нет Всего: 2 |
Как вариант, во второй функции можно захватывать 3й мьютекс, делайть трайлок первого, если он занят - освобождать 3й мьютекс и повторять попытку через время, опять начиная с захвата 3го мьютекса. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |