Оба типа предназначены для блокировки при разрушении (например, при выходе из области действия) до завершения потока.Разница заключается во владении объектом thread
.
thread_guard
не владеет самим thread
;на одном и том же thread
может быть более одного thread_guard
.Это также означает, что объект thread
должен быть живым до тех пор, пока любой thread_guard
ссылается на него.Если указанный поток уже был присоединен при уничтожении объекта thread_guard
, он не будет блокировать или выдавать ошибку (в отличие от простого вызова join
в потоке, который нельзя присоединить).
scoped_thread
, с другой стороны, становится владельцем экземпляра thread
и, следовательно, также контролирует его время жизни.Вы будете использовать его всякий раз, когда захотите владеть потоком, от которого хотите ждать, например, в качестве члена данных.
В конечном счете, какой из них вы используете, это вопрос семантики: хотите ли вы кого-то ждать в потокеостальное владеет (тогда вы также должны убедиться, что нет проблем со временем жизни), или вам нужен объект thread
, который блокируется при его разрушении, без необходимости join
его сначала.