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

У меня есть многопоточная программа C/C++, которая очень часто обслуживает запросы на чтение и запись. В целях синхронизации я использовал мьютекс для блокировки и разблокировки. Все потоки чтения и записи получают блокировку перед выполнением своих операций. Что произойдет, если один поток захватит блокировку и, прежде чем он сможет ее снять, произойдет прерывание? Будет ли поток возобновлять выполнение или мне придется обрабатывать его вручную?


person user3296247    schedule 06.03.2014    source источник
comment
Никто волшебным образом не разблокирует заблокированный мьютекс. Недостаток программирования с блокировками состоит в том, что время ожидания может быть сколь угодно большим и могут возникать взаимоблокировки. (Тем не менее, обработчики прерываний обычно возвращают выполнение туда, где они остановились, в конце концов.)   -  person Kerrek SB    schedule 06.03.2014


Ответы (3)


Пользовательские блокировки, включая мьютексы, не блокируют прерывания. Это важно, поскольку часто мьютекс может использоваться для защиты чтения из файла на диске или защиты приема пакетов из сети и т. д., где результат зависит от прерывания.

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

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

person Mats Petersson    schedule 06.03.2014

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

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

person amdn    schedule 06.03.2014

Тот факт, что поток имеет блокировку, не зависит от сигналов. Если поток имеет блокировку и получает сигнал, ничего особенного не произойдет. На самом деле сигналы и потоки плохо сочетаются друг с другом, поскольку сигналы разрабатывались с учетом процессов. Это потому, что вы не можете знать, какой поток получит сигнал. Правильный способ справиться с этим – выделить отдельный поток для управления сигналами, например, заблокировать все сигналы во всех потоках, кроме одного, единственной обязанностью которого является обработка сигналов. Это правильный способ обработки сигналов в программном обеспечении с потоками.

person neuro    schedule 06.03.2014