#c #recursion #stdthread
Вопрос:
У меня есть класс, выполняющийся в потоке. Но я хочу, чтобы он работал только 10 секунд. Примечание… У меня нет возможности передать какое-либо логическое значение в класс, чтобы остановить выполнение. Итак, как я могу настроить завершение потока через 10 секунд?
Класс, который я тестирую, имеет потенциальную бесконечную рекурсию, которая может иметь место, и бессмысленно позволять ему работать дольше 10 секунд.
TEST_METHOD(TM_ClientServer_Threads)
{
bool bDone = false;
int ii = 0;
std::thread tCounter([amp;bDone, amp;ii]()
{
// Black Box: can't touch this; can't pass in a Boolean
while(true)
{
ii ;
}
}
);
std::thread tTimer([amp;bDone, amp;tCounter]()
{
Sleep(1000);
bDone = true;
// kill the tCounter thread ?
}
);
tCounter.join();
tTimer.join();
ii = ii 0; // break point here
}
Комментарии:
1. Попросите поток периодически останавливать то, что он делал, и проверять время. Если его десять секунд истекли, он возвращается.
2. » У меня нет доступа к операциям внутри класса» — Ну, тогда вы правы, вам просто нужно «создать другой поток, а затем каким-то образом убить другой поток». Здесь вы не оставляете себе практически никаких вариантов.
3. Похоже, вы уже знаете об этом, но я все равно оставлю это для тех, кто следит: убийство потоков-это абсолютное последнее средство. Есть много вещей, которые вы должны знать о потоке, о том, что происходит в потоке и что происходит в операционной системе, прежде чем вы даже подумаете об этом. И даже если вы это сделаете, все равно будет безопаснее перезапустить всю программу, а не поток.
4. @user4581301: Просто для самого простого примера проблемы, даже если ваш API потоковой передачи неразумно предоставляет средства для уничтожения потоков, если рассматриваемый поток находился в середине
new
/malloc
илиdelete
/free
и удерживал блокировку кучи в момент его уничтожения, теперь ничто не может выделить или освободить память в процессе навсегда. Когда вам нужно иметь возможность безопасно завершить выполнение извне, не контролируя внутреннюю часть, единственным безопасным решением является отдельный процесс (когда при уничтожении все ресурсы возвращаются в ОС). На UNIX-подобных,fork
инг даже не такой тяжеловес.5. Я добавлю, что уничтожение потока приведет к непредвиденным последствиям для любого кода, использующего локальное хранилище потоков. Уничтожение потока вообще не должно быть вариантом в крайнем случае. Если дизайн вашей программы требует, чтобы вы убили поток, то вашу программу необходимо переработать .