2017-02-06 13 views
0

Привет всем, Я использую многопоточность в C++ 11. Я хочу создать механизм, в котором он будет отслеживать все запущенные и завершенные потоки. Если любой поток завершен, он автоматически создаст завершенный поток. У кого-нибудь есть идея относительно того, как реализовать это в C++ 11? Заранее большое спасибо.Как отслеживать завершение потока в C++ 11

+1

Я предполагаю, что вы будете * присоединяться к завершенной теме? Простое решение - это просто атомный логический флаг, который нить устанавливает последнее, что он делает до выхода. Основной поток проверяет этот флаг, и если он установлен, присоедините поток. –

+0

Чтобы добавить комментарий @Someprogrammerdude, обратите внимание, что некоторые * потоковые библиотеки * (например, * pthreads *) предоставляют дополнительное * неблокирующее соединение *, которое устраняет проблему * опроса * состояния потока * перед * присоединением * его. Это может быть менее эффективным, но это должно привести к более чистому дизайну. –

+0

Спасибо за ваш повтор @Someprogrammerdude. Я никогда раньше не использовал атомный флаг. где мне нужно добавить этот логический флаг в мою программу? –

ответ

0

Общий шаблон для написания кода, который выживает исключения является обернуть его в петлю и попробовать блок, как это:

for(;;) { 
    try { 
     // Your code here 
    } catch (const std::exception& e) { 
     // Log exception 
    } catch (...) { 
     // Log unknown exception 
    } 
} 

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

Вы можете поместить этот цикл в свою нить, чтобы он не разбился, если что-то случится, или вместо непосредственного использования потоков вы можете использовать std::future и поместить код future.get() внутри этого цикла.