2014-12-10 8 views
2

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

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

+5

Результат 'joinable()' не зависит от того, закончил ли поток выполнение. В вашем сценарии 'joinable()' фактически не становится 'false', пока вы не назовете' detach() '. Здесь нет никаких проблем, требующих обходного пути. –

+5

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

+0

Хорошие баллы. Я получаю это поведение в Visual Studio 2012. Возможно, какая-то ошибка оптимизации? –

ответ

2

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

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

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

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

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

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

+1

Это, конечно, содержит состояние гонки, так как оно может стать неприступным после проверки, но до отрыва. – jcoder

+0

@jcoder Это было бы правдой, если бы протектора тем временем стала неприступной. Как вы это себе представляете? – laurisvr

1

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