2012-03-09 3 views
1

У меня есть сомнения относительно мьютексов.Можно ли спать нить, удерживающая замок?

Global mutex; 
/// more things 
Acquire lock on mutex; 
/// Do things here; 
Release lock; 

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

+1

Его можно уложить спать «ЦП», но НИКОГДА не класть его в 'Sleep()' самостоятельно вручную внутри 'Mutex'. ** Это затормозит. ** – CodeAngry

ответ

3

Да нить, содержащая мьютекс, определенно может быть усыпан, и, вероятно, она будет спать.

Если у вас есть одно ядро, то только один поток может работать в один момент времени. Если у вас есть 10 потоков, работающих на одном ядре, то 9 будет спать в любой момент времени.

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

+0

Спасибо за ваш ответ. Итак, когда поток усыпан, он отказывается от блокировки на мьютексе или держит его? –

+0

Привет? Еще нужна помощь ... –

+0

Он держит его. – dan

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