Интересно, есть ли способ прекратить мой процесс, написанный на C++ 11 через некоторое время?Как вы можете чисто завершить процесс в C++ 11?
В моем процессе у меня есть основной класс с чистой виртуальной функцией run()
, управляющий основной программой, которая может быть заблокирована в процессах связи. Я хочу, чтобы моя функция run()
была вынуждена закончить через некоторое время (даже если она заблокирована) и деструктор моего основного класса (и всех деструкторов членов).
Теперь у меня есть таймер, который вызывает std::terminate
через обратный вызов.
namespace Timer
{
void start(Duration time, function<void()> task)
{
thread([time, task]() {
this_thread::sleep_for(time);
task();
}).detach();
}
}
Если функция 'run()' не вернется, вы не сможете закончить программу в чистоте.Возможно, вы могли бы запустить 'run()' в потоке и вызвать 'thread :: detach()' на нем: будут вызваны основные деструкторы, но я бы не назвал его _clean_. – rodrigo
У меня была эта проблема, тоже с программой, которая могла застрять в общении. Я добавил к нему библейский ритм, поэтому я знаю каждые X секунд (в моем случае каждые 45 секунд) сообщение будет получено и отправлено, а затем будет установлен тайм-аут минуты. Поэтому я никогда не попадаю в случай, когда я застреваю и жду сообщения. Конечно, худший случай заключался в том, что программе нужно было 45 секунд, чтобы закрыть, но она чиста! – Nidhoegger
Если заблокирован (отсоединенный) поток, он не может быть изящно завершен без первого разблокирования. Вы должны управлять этим синтаксически с помощью _e.g._, используя wait/notify или периодически проверять статус с помощью 'wait_for' или аналогичного. – Snps