Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / C++ Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Через какое время будет заблокирован мьютекс?  [new]
petrav
Member

Откуда:
Сообщений: 2944
Интересный вопрос мне тут задали.

Поток 1 захватил мьютекс, потом поток 2 пытается захватить этот мьютекс и поток 2 блокируется.
Потом поток 1 отпускает мьютекс. Вопрос: через какое время мьютекс будет захвачен потоком 2?
7 июн 21, 20:28    [22332539]     Ответить | Цитировать Сообщить модератору
 Re: Через какое время будет заблокирован мьютекс?  [new]
x1ca4064
Member

Откуда:
Сообщений: 1269
petrav
Вопрос: через какое время мьютекс будет захвачен потоком 2?


IMHO, общий ответ - неизвестно и ос-специфично. Мьютекс задействует планировщик, поэтому вопрос связан с тем, когда поток получит квант времени, а это, теоретически, может и вообще никогда не случиться.
7 июн 21, 20:51    [22332544]     Ответить | Цитировать Сообщить модератору
 Re: Через какое время будет заблокирован мьютекс?  [new]
x1ca4064
Member

Откуда:
Сообщений: 1269
petrav
Вопрос: через какое время мьютекс будет захвачен потоком 2?


С другой стороны, можно сказать и 0: если есть ожидающий поток, то мутекс и не разблокируется...
7 июн 21, 21:03    [22332547]     Ответить | Цитировать Сообщить модератору
 Re: Через какое время будет заблокирован мьютекс?  [new]
petrav
Member

Откуда:
Сообщений: 2944
x1ca4064,

Я, в общем, согласен с обоими вашими утверждениями. Но…

1. Вопрос задавался именно с намёком, что какие-то гарантии по времени существуют. Но кто и когда такие гарантии давал совершенно не понятно.

2. В чём смысл такого вопроса с точки зрения разработки многопоточных программ? Ведь поток 2 не может знать висел ли он на ожидании мьютекса или нет.

По итогу, этот вопрос больше похож на знание внутренней работы ядра Линукса в той или иной версии.

Сообщение было отредактировано: 7 июн 21, 21:55
7 июн 21, 22:02    [22332567]     Ответить | Цитировать Сообщить модератору
 Re: Через какое время будет заблокирован мьютекс?  [new]
Anatoly Moskovsky
Member

Откуда: Odessa
Сообщений: 6658
petrav,

Если оба потока на одном ядре - то второй поток получит управление на следующем кванте планировщика и затратит на блокировку мьютекса несколько тактов процессора, т.к. будет работать с локальным кэшем.
Если потоки на разных ядрах, то в лучшем случае (если ожидающий поток еще не остановлен, а крутится в спинлоке) время будет равно времени инвалидации кэша + время загрузки кэшлинии из памяти в кэш.
В худшем случае, когда поток уже остановлен, нужно добавить еще квант планировщика.
В абсолютных числах это от сотен наносек до нескольких миллисек.
7 июн 21, 22:35    [22332584]     Ответить | Цитировать Сообщить модератору
 Re: Через какое время будет заблокирован мьютекс?  [new]
mayton
Member

Откуда: loopback
Сообщений: 51389
Вопрос станет еще более интересным если потоков будет не 2 а 3. И тогда можно обсудить, будет
ли время ожидания "справедливым" для каждого ждущего потока.
8 июн 21, 00:18    [22332613]     Ответить | Цитировать Сообщить модератору
 Re: Через какое время будет заблокирован мьютекс?  [new]
White Owl
Member

Откуда:
Сообщений: 12733
Anatoly Moskovsky
Если оба потока на одном ядре - то второй поток получит управление на следующем кванте планировщика
Нет. Это возможно, но не обязательно.
Если на машине в это время висит еще один процесс с более высоким приоритетом, то он может вполне вклиниться между двумя потоками желающими одного мьютекса. И насколько это "вклинивание" растянется предсказать нельзя.

Anatoly Moskovsky
В худшем случае, когда поток уже остановлен, нужно добавить еще квант планировщика.
В абсолютных числах это от сотен наносек до нескольких миллисек.
Я бы сказал: "в лучшем случае, только один квант планировщика будет между освобождением и повторных захватом".
Да и по времени надо бы увеличить - "от сотен наносекунд, до нескольких секунд". А если у машины кончилась память и ОС начала свапить, то и минуты могут набежать...
8 июн 21, 05:41    [22332633]     Ответить | Цитировать Сообщить модератору
 Re: Через какое время будет заблокирован мьютекс?  [new]
Dima T
Member

Откуда:
Сообщений: 15795
petrav
1. Вопрос задавался именно с намёком, что какие-то гарантии по времени существуют. Но кто и когда такие гарантии давал совершенно не понятно.

Линукс, как и виндавс, ОС с вытесняющей многозадачностью, поэтому нет никаких гарантий по времени. Как только ОС сможет - так сразу начнет выполнять тот поток.

petrav
По итогу, этот вопрос больше похож на знание внутренней работы ядра Линукса в той или иной версии.

Гугли квант времени линукс
8 июн 21, 07:30    [22332638]     Ответить | Цитировать Сообщить модератору
 Re: Через какое время будет заблокирован мьютекс?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8256
petrav,
Нужно уточнять ваш вопрос - с какой точностью интересует время?
8 июн 21, 09:06    [22332661]     Ответить | Цитировать Сообщить модератору
 Re: Через какое время будет заблокирован мьютекс?  [new]
Anatoly Moskovsky
Member

Откуда: Odessa
Сообщений: 6658
White Owl
Если на машине в это время висит еще один процесс

В условии нет никаких других процессов и потоков.
8 июн 21, 10:38    [22332702]     Ответить | Цитировать Сообщить модератору
 Re: Через какое время будет заблокирован мьютекс?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8256
Anatoly Moskovsky
White Owl
Если на машине в это время висит еще один процесс

В условии нет никаких других процессов и потоков.
) +1
Вопрос сродни вопросу, сколько времени между нажатии на тормоз педали и начале торможения колес))
8 июн 21, 12:07    [22332772]     Ответить | Цитировать Сообщить модератору
 Re: Через какое время будет заблокирован мьютекс?  [new]
petrav
Member

Откуда:
Сообщений: 2944
Dima T
petrav
1. Вопрос задавался именно с намёком, что какие-то гарантии по времени существуют. Но кто и когда такие гарантии давал совершенно не понятно.

Линукс, как и виндавс, ОС с вытесняющей многозадачностью, поэтому нет никаких гарантий по времени. Как только ОС сможет - так сразу начнет выполнять тот поток.

petrav
По итогу, этот вопрос больше похож на знание внутренней работы ядра Линукса в той или иной версии.

Гугли квант времени линукс

Мне кажется тут большинство всё же не правильно понимает вопрос. Почти все говорят про получение потоком кванта времени, вот он просыпается (поток), захватывает мьютекс и начинает работать.

А правильный ответ: мьютекс будет захвачен "мгновенно". Просто функция разблокировки мьютекса в данном случае не будет его разблокировать, а просто "передаст" на "содержание" второму потоку. Второй поток захватит мьютекс до того как начнёт работать. Об этом и писал x1ca4064. А уж когда второму потоку будет выделен квант времени — это вопрос десятый.
8 июн 21, 12:20    [22332782]     Ответить | Цитировать Сообщить модератору
 Re: Через какое время будет заблокирован мьютекс?  [new]
Dima T
Member

Откуда:
Сообщений: 15795
petrav
Мне кажется тут большинство всё же не правильно понимает вопрос. Почти все говорят про получение потоком кванта времени, вот он просыпается (поток), захватывает мьютекс и начинает работать.

А правильный ответ: мьютекс будет захвачен "мгновенно". Просто функция разблокировки мьютекса в данном случае не будет его разблокировать, а просто "передаст" на "содержание" второму потоку. Второй поток захватит мьютекс до того как начнёт работать. Об этом и писал x1ca4064. А уж когда второму потоку будет выделен квант времени — это вопрос десятый.

Если чмтать буквально, то ответ правильный: после освобождения мьютекса ожидающий поток сразу ставится в очередь на получение своего кванта времени.
Только какая практическая польза от этого знания?
8 июн 21, 12:26    [22332785]     Ответить | Цитировать Сообщить модератору
 Re: Через какое время будет заблокирован мьютекс?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 53394

petrav
А правильный ответ: мьютекс будет захвачен "мгновенно".

То есть если первый поток вызовет функцию захвата мутекса сразу после его освобождения, то
он гарантированно никогда мутекс не получит и она 100% упадёт в ожидание второго потока?
Ню-ню...

Posted via ActualForum NNTP Server 1.5

8 июн 21, 12:30    [22332787]     Ответить | Цитировать Сообщить модератору
 Re: Через какое время будет заблокирован мьютекс?  [new]
petrav
Member

Откуда:
Сообщений: 2944
Dimitry Sibiryakov

petrav
А правильный ответ: мьютекс будет захвачен "мгновенно".

То есть если первый поток вызовет функцию захвата мутекса сразу после его освобождения, то
он гарантированно никогда мутекс не получит и она 100% упадёт в ожидание второго потока?
Ню-ню...

Откуда же у вас такие выводы?
8 июн 21, 12:35    [22332790]     Ответить | Цитировать Сообщить модератору
 Re: Через какое время будет заблокирован мьютекс?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 53394

petrav
Откуда же у вас такие выводы?

Внезапно: из Ваших же слов. Если освобождение мутекса вызывает его мгновенный захват
спящим потоком, то захват этого мутекса кем угодно ещё (включая поток его только что
освободивший) невозможно до получения спящим потоком кванта времени. Не так ли?..

Posted via ActualForum NNTP Server 1.5

8 июн 21, 12:45    [22332796]     Ответить | Цитировать Сообщить модератору
 Re: Через какое время будет заблокирован мьютекс?  [new]
petrav
Member

Откуда:
Сообщений: 2944
Dimitry Sibiryakov

petrav
Откуда же у вас такие выводы?

Внезапно: из Ваших же слов. Если освобождение мутекса вызывает его мгновенный захват
спящим потоком, то захват этого мутекса кем угодно ещё (включая поток его только что
освободивший) невозможно до получения спящим потоком кванта времени. Не так ли?..

Конечно. Но когда-то же поток 2 получит свои кванты, отработает и вызовет функцию освобождения мьютекса.
8 июн 21, 12:48    [22332799]     Ответить | Цитировать Сообщить модератору
 Re: Через какое время будет заблокирован мьютекс?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 53394

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

В условиях ЦПУ голодания и фонового приоритета - никогда. Отсюда вывод: в ОС, которая
работает так, как Вы описываете, группа потоков, использующих один мутекс, работает с
приоритетом наинизшего из них.

Posted via ActualForum NNTP Server 1.5

8 июн 21, 12:54    [22332804]     Ответить | Цитировать Сообщить модератору
 Re: Через какое время будет заблокирован мьютекс?  [new]
petrav
Member

Откуда:
Сообщений: 2944
Dimitry Sibiryakov

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

В условиях ЦПУ голодания и фонового приоритета - никогда. Отсюда вывод: в ОС, которая
работает так, как Вы описываете, группа потоков, использующих один мутекс, работает с
приоритетом наинизшего из них.

Вообще-то так и есть, если упрощённо. Это называется priority failures, если не ошибаюсь.

А в RTOS для борьбы с этим есть инверсия приоритетов.

Сообщение было отредактировано: 8 июн 21, 13:00
8 июн 21, 13:02    [22332810]     Ответить | Цитировать Сообщить модератору
 Re: Через какое время будет заблокирован мьютекс?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 53394

petrav
Вообще-то так и есть, если упрощённо.

Вот именно. Хорошо, что ко второй странице это до Вас дошло. Теперь Вы способны не только
правильно ответить на вопрос собеседования, но и оценить его последствия для своего
приложения. Поздравляю с профессиональным ростом.

Posted via ActualForum NNTP Server 1.5

8 июн 21, 13:13    [22332822]     Ответить | Цитировать Сообщить модератору
 Re: Через какое время будет заблокирован мьютекс?  [new]
petrav
Member

Откуда:
Сообщений: 2944
Dimitry Sibiryakov

petrav
Вообще-то так и есть, если упрощённо.

Вот именно. Хорошо, что ко второй странице это до Вас дошло. Теперь Вы способны не только
правильно ответить на вопрос собеседования, но и оценить его последствия для своего
приложения. Поздравляю с профессиональным ростом.

Что-то кажется мне, что вы заблудились.

Ну допустим мьютекс захватывается низкоприоритетным потоком 2 не мгновенно, а после получения
кванта времени. Этот поток в условиях "ЦПУ голодания и фонового приоритета" может никогда это
мьютекс и не отпустить. И все высокоприоритетные потоки зависнут на этом мьютексе.
8 июн 21, 13:18    [22332828]     Ответить | Цитировать Сообщить модератору
 Re: Через какое время будет заблокирован мьютекс?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 53394

petrav
Этот поток в условиях "ЦПУ голодания и фонового приоритета" может никогда это
мьютекс и не отпустить.

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

Posted via ActualForum NNTP Server 1.5

8 июн 21, 13:35    [22332844]     Ответить | Цитировать Сообщить модератору
 Re: Через какое время будет заблокирован мьютекс?  [new]
petrav
Member

Откуда:
Сообщений: 2944
Dimitry Sibiryakov

petrav
Этот поток в условиях "ЦПУ голодания и фонового приоритета" может никогда это
мьютекс и не отпустить.

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

Ох, ну и ну. Если мы находимся в таких условиях, то в большинстве случаев нагрузка на ЦПУ не
равномерна. У низкоприоритетного потока всегда есть шанс захватить мьютекс. Хоть мгновенно,
хоть не мгновенно. А после этого обрушить логику работы высокоприоритетных потоков.

То что мгновенный захват несколько повышает вероятность обрушения. Ну... может быть. Но в
любом случае в таких случаях фоновый поток не должен разделять мьютексы с высокоприоритетными
потоками.

Или по другому: если фоновый поток хочет захватить мьютекс, значит это нужно для логики программы.
Значит он не должен быть фоновым в случае высокой нагрузки.

Или использовать инверсию приоритетов.

Сообщение было отредактировано: 8 июн 21, 13:36
8 июн 21, 13:43    [22332851]     Ответить | Цитировать Сообщить модератору
 Re: Через какое время будет заблокирован мьютекс?  [new]
petrav
Member

Откуда:
Сообщений: 2944
Dimitry Sibiryakov,

Или вот так. Допустим мгновенный захват мьютекса привёл к блокировке мьютекса фоновым потоком,
которому не выделяются кванты времени. И это разрушило нашу программу. Но как же тогда (по
условиям задачи) этот фоновый поток смог попытаться захватить мьютекс в то время когда он был
захвачен первым потоком?

И может даже мгновенный захват предпочтительнее? Ведь фоновому потоку всё же нужно работать.
Ну раз там захват мьютекса, то нужно же! А мгновенным захватом мы шанс даём. Но это опять же уже
какое-то программирование в вероятностях.
8 июн 21, 14:35    [22332901]     Ответить | Цитировать Сообщить модератору
 Re: Через какое время будет заблокирован мьютекс?  [new]
mayton
Member

Откуда: loopback
Сообщений: 51389
petrav
Dimitry Sibiryakov

пропущено...

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

Ох, ну и ну. Если мы находимся в таких условиях, то в большинстве случаев нагрузка на ЦПУ не
равномерна. У низкоприоритетного потока всегда есть шанс захватить мьютекс. Хоть мгновенно,
хоть не мгновенно. А после этого обрушить логику работы высокоприоритетных потоков.

Я читал где-то про такой алгоритм приоритезации. Кажется во FreeBSD. Вобщем поток имеющий
низкий приоритет (голодающий) в то врема когда 100% квантов потребляют более важные потоки,
всё таки имеет гарантированный шанс получить свой квант даже в таких условиях. Это что-то вроде
защиты от зависания потока.

Вот насчет FreeBSD я не уверен сильно.
8 июн 21, 15:23    [22332944]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / C++ Ответить