Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Что применяют от "deadlock'ов"?


Автор: xTr1m 23.5.2013, 14:10
Подскажите пожалуйста, какой прием применяется в таком случае (псевдокод)
Код

функция_потока_1()
{
захватить_мьютекс_1;
захватить_мьютекс_2;
захватить_мьютекс_3;
...
}

функция_потока_2()
{
захватить_мьютекс_3;
...
захватить_мьютекс_1;
...
}

то есть может быть ситуация, когда второй поток успеет захватить мьютекс_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
такова суровая реальность, по другому никак

Автор: fish9370 23.5.2013, 14:52
Цитата(xTr1m @  23.5.2013,  14:35 Найти цитируемый пост)
или этим приходится жертвовать и тогда захватывать во все потоках в одинаковом порядке


и все-таки тут кое-что нужно уточнить, если мы будем последовательно захватывать и освобождать мьютексы, то порядок не существеннет, но если захват вложенный, то необходимо вводить порядок

Код

функция_потока_1() {
захватить_мьютекс_1;
освободить_мьютекс_1;

захватить_мьютекс_2;
освободить_мьютекс_2;

захватить_мьютекс_3;
освободить_мьютекс_3;
...
}

функция_потока_2() {
захватить_мьютекс_3;
освободить_мьютекс_3;
...
захватить_мьютекс_1;
освободить_мьютекс_1;
...
}


нет зависимости, нет дедлока

Автор: xTr1m 23.5.2013, 15:13
нет, я имел в виду случай, когда поток_1 использует все три ресурса одновременно, а поток_2 по очереди
Код

функция_потока_1() {
захватить_мьютекс_1;
захватить_мьютекс_2;
захватить_мьютекс_3;

копируем из ресурса_1 в ресурс_2 и в ресурс_3; // допустим одной функцией
ресурс_1 = делаем запись в лог
...
}

или получается, что нужно стараться делать так, чтобы можно было захватить / отредактировать / освободить?

Автор: bsa 23.5.2013, 16:05
Цитата(xTr1m @  23.5.2013,  16:13 Найти цитируемый пост)
или получается, что нужно стараться делать так, чтобы можно было захватить / отредактировать / освободить?

 smile 

Автор: xTr1m 23.5.2013, 16:09
ну что же, большое спасибо, буду знать.

Автор: Alexeis 23.5.2013, 16:25
  Если поток не смог захватить 3 одновременно, то он должен освободить все 3 и потом повторно попытаться их захватить. В винде есть функция WaitForMultipleObjects . Она позволяет захватывать одновременно группу объектов. Не по одиночке, а сразу группу. 

Автор: NoviceF 23.5.2013, 19:08
Код

функция_потока_1()
{
захватить_мьютекс_1;
захватить_мьютекс_2;
захватить_мьютекс_3;
...
}
функция_потока_2()
{
захватить_мьютекс_3;
...
захватить_мьютекс_1;
...
}


Как вариант, во второй функции можно захватывать 3й мьютекс, делайть трайлок первого, если он занят - освобождать 3й мьютекс и повторять попытку через время, опять начиная с захвата 3го мьютекса.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)