2013-11-18 3 views
2

Это вопрос интервью. В общем, тупик между двумя потоками генерируется, когда thread1 блокирует mutex1, и за мгновение до того, как он попытается заблокировать mutex2, поток 2 блокирует mutex2.После этого протектора 2 хочет заблокировать mutex1.Так они ждут друг друга навсегда.можно создать тупик с одним замком

Вопрос: «Можете ли вы дать сценарий тупика с одним мьютексом и любым количеством потоков?»

ответ

4

Это зависит от того, как вы определяете «тупиковой» Я думаю, но я мог видеть одну возможность:

  1. Поток А захватывает мьютекс
  2. Thread B ждёт мьютекса
  3. Поток А умирает, не отпуская мьютекс

Нить B никогда не запускается.

+1

Это просто плохая программа. Но это хороший ответ! –

+0

Правильно, и Thread A может даже не понадобиться умирать, чтобы вызвать тупик: если код между мьютексом и релизом должен был выдать исключение (в языке, поддерживающем исключения), а релиз не был каким-то «окончательным» 'block, ни один нить никогда не сможет получить этот замок снова.Это звучит как совершенно реальная возможность для меня, и, как указывает Джеймс, большой вопрос интервью. –

0

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

4

Взаимоблокировка требует 4 вещи:

взаимоисключения - относится к идее наличия ресурса (замок), который может принадлежать одной нити.
Нет упреждение - замки не могут быть получены принудительно
Circular Wait - не относится к один поток, ожидающий на другой, что ждет на себя (или цепи)
Удержание и подождите - поток способен принимать один замок и подождите еще

В интервью, как правило, важно показать им свои мыслительные процессы, и если вы поднимете эти правила, они, вероятно, сделают больше для вас, чем попытку дать «технически правильный» ответ.

Вы могли бы сделать это таким образом, хотя:
Master нить блокирует ресурс, а затем отправляет некоторые задачи в пул потоков. Эти задачи ждут ресурса. Главный поток ждет задач.

+0

«ждет задач», «дождитесь ресурса». Я думаю, что это лучше раскрывает недостаток в понимании Якова: это не замки, которые вызывают взаимоблокировки, он что-то ждет (будь то замок или что-то еще). –

0

Да, заблокировать мьютекс или критическую секцию, но забывает, чтобы разблокировать его (скажем, в определенном выходном пути коды). Следующий поток, который пытается получить доступ к этому коду, является тупиком. Я просто столкнулся с этим сценарием.

0

Когда вы думаете о взаимоблокировке (и в большинстве тематических тем), вы не рассматриваете механизмы синхронизации потоков, а ресурс приобретает. Вы можете сделать тупик без каких-либо мьютексов, событий или semafor, просто ожидая правильного состояния ресурса в цикле, если эта ситуация произошла для всего потока, который может изменить ваш ресурс, у вас есть тупик. В этом свете я считаю, что правильный ответ должен состоять в том, что вопрос задают плохо.

Смежные вопросы