Спят ли потоки при ожидании на заблокированном мьютексе? - PullRequest
0 голосов
/ 28 декабря 2018

Потоки, заблокированные std::mutex::lock() или переменной условия, спят таким образом, что освобождает ядро ​​для других процессов, или я должен вручную перевести эти потоки в спящий режим?И если это правда, std::mutex::try_lock() позволит способ вращать поток без сна?

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

Я хочу избежать вызова режима сна вручную, если я могу помочь, настраивая режим снаПродолжительность будет трудно.Так я могу спокойно оставить это мьютексу?

Ответы [ 2 ]

0 голосов
/ 28 декабря 2018

Это зависит от реализации;стандарт C ++ не говорит с ним напрямую.

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

Никакая реализация C ++ на основном телефоне, ПК или железном железе не будет вращаться.заблокировать на неопределенный срок, однако.Я мог бы представить, как это делает какая-то встроенная система, но лично с ней не сталкивался.

0 голосов
/ 28 декабря 2018

Да.Такие заблокированные потоки спят и не занимают никаких циклов ЦП.

...