Как я могу приостановить возобновление всего потока?

Мой вариант использования: процесс A -> запрос на паузу/возобновление (через IPC) -> процесс B

Моя цель - сохранить использование ЦП процессом B, когда процесс B находится в фоновом режиме. Потому что все потоки процесса B потребляют ресурсы ЦП. Так что я хочу приостановить/перезапустить все потоки процесса B, когда захочу.

Q1) как я могу приостановить/возобновить все потоки в процессе B?

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

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

<main thread of B process>
while(1)
{
 mCondition.wait(lock);
 //all thread are create & run in here
}

<handler thread of  B process>
if(request resume)
 mCondition.notify_one();
else
 //terminate all thread of B process

=> Эта идея — способ завершить все потоки и воссоздать все потоки.


person Hercoa    schedule 18.02.2019    source источник
comment
Вы должны указать свою платформу. Стандарт C мало говорит о IPC, насколько мне известно.   -  person PSkocik    schedule 18.02.2019


Ответы (2)


На платформах POSIX вы можете просто kill(targetPid, SIG{STOP,CONT}) выполнить целевой процесс, и он приостановит/возобновит все свои потоки.

person PSkocik    schedule 18.02.2019

На самом деле не существует «кросс-платформенного» способа завершения потоков.

Поскольку вы реализуете механизм паузы (выглядит как условная_переменная? Я просто предполагаю, что это так), самый безопасный способ сделать это, вероятно, установить где-нибудь флаг «TERMINATE» и разбудить рабочие потоки. Когда рабочий поток просыпается, сначала проверьте этот флаг, чтобы увидеть, должен ли он завершиться. Если нет, то продолжайте его работу, а если да, то просто найдите способ выйти из рабочей функции. Это в основном то, как вы безопасно завершаете поток в C++.

person 刘予顺    schedule 18.02.2019