std :: thread заканчивается, прежде чем я могу отсоединить его

Если я создаю 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();
}

Я понимаю, что на самом деле не практично создавать поток для выполнения тривиальной работы на практике, однако мне удалось столкнуться с таким поведением, и мне было любопытно узнать, есть ли способ обойти это …

2

Решение

Присоединение и отсоединение имеют одинаковые требования, они должны быть присоединяемыми. Так что я думаю, что выполнение присоединяемой проверки должно быть достаточно.

If(trivial.joinable())
trivial.detach();

Документация состояния:

Поток, который завершил выполнение кода, но еще не был присоединен, все еще считается активным потоком выполнения и поэтому является присоединяемым.

Так что я думаю, что отдельная нить перестанет существовать сразу. Но это определенно может быть создано.

Замечания:
Это хорошая практика, чтобы всегда звонить joinable() перед присоединением или отсоединением нити.

2

Другие решения

Объект потока будет разрушен, когда будет выполнена его область.
Чтобы убедиться, что объект завершил свою работу, вам нужно либо вызвать join или detach.

1

По вопросам рекламы [email protected]