Если я создаю std :: thread, который завершает работу до того, как я смогу позвонить detatch()
на нем, каково ожидаемое поведение? Следует ли исключить исключение из-за того, что joinable
уже неверно?std :: thread заканчивается, прежде чем я смогу отделить его
Если это так, то есть ли способ создать поток, который инициализируется в отдельном состоянии, чтобы я мог избежать этой ошибки?
Пример:
void func()
{
// do something very trivial so that it finishes fast
int a = 1;
}
void main()
{
thread trivial(func);
trivial.detach();
}
Я понимаю, что это на самом деле не практично, чтобы породить нить сделать тривиальную работу на практике, однако мне удалось бежать в такое поведение, и мне было интересно узнать, есть способ обойти его ...
Результат 'joinable()' не зависит от того, закончил ли поток выполнение. В вашем сценарии 'joinable()' фактически не становится 'false', пока вы не назовете' detach() '. Здесь нет никаких проблем, требующих обходного пути. –
'Нить, которая закончила выполнение кода, но еще не была присоединена, по-прежнему считается активной нитью исполнения и поэтому является соединяемой.' –
Хорошие баллы. Я получаю это поведение в Visual Studio 2012. Возможно, какая-то ошибка оптимизации? –