Если я создаю std :: thread, который завершается до того, как я смогу вызвать detatch()
на нем, каково ожидаемое поведение? Должно ли быть выброшено исключение из-за того, что joinable
уже ложно?
Если это так, то есть ли способ создать поток, который инициализируется в отдельном состоянии, чтобы я мог избежать этой ошибки?
Пример:
void func()
{
// do something very trivial so that it finishes fast
int a = 1;
}
void main()
{
thread trivial(func);
trivial.detach();
}
Я понимаю, что на самом деле не практично создавать поток для выполнения тривиальной работы на практике, однако мне удалось столкнуться с таким поведением, и мне было любопытно узнать, есть ли способ обойти это …
Присоединение и отсоединение имеют одинаковые требования, они должны быть присоединяемыми. Так что я думаю, что выполнение присоединяемой проверки должно быть достаточно.
If(trivial.joinable())
trivial.detach();
Документация состояния:
Поток, который завершил выполнение кода, но еще не был присоединен, все еще считается активным потоком выполнения и поэтому является присоединяемым.
Так что я думаю, что отдельная нить перестанет существовать сразу. Но это определенно может быть создано.
Замечания:
Это хорошая практика, чтобы всегда звонить joinable()
перед присоединением или отсоединением нити.
Объект потока будет разрушен, когда будет выполнена его область.
Чтобы убедиться, что объект завершил свою работу, вам нужно либо вызвать join или detach.