Ответ 1
Объект thread
C++ в целом (но не всегда) представляет собой поток выполнения, который представляет собой концепцию ОС или платформы.
Когда вызывается thread::join()
, вызывающий поток блокируется до тех пор, пока поток выполнения не завершится. В принципе, это один из механизмов, который можно использовать, чтобы знать, когда поток завершен. Когда thread::join()
возвращается, поток выполнения ОС завершен, и объект thread
C++ может быть уничтожен.
thread::detach()
, поток выполнения "отсоединен" от объекта thread
и больше не представлен объектом thread
- это две независимые вещи. Объект thread
C++ может быть уничтожен, а поток выполнения ОС может продолжаться. Если программа должна знать, когда эта последовательность выполнения завершена, необходимо использовать другой механизм. join()
больше нельзя вызывать в этом thread
объекте, поскольку он больше не связан с потоком выполнения.
Считается ошибкой уничтожить объект thread
C++, пока он все еще "соединяется". То есть, чтобы уничтожить объект thread
C++, необходимо либо вызвать join()
либо вызвать detach()
. Если объект thread
C++ все еще соединяется при его уничтожении, будет выбрано исключение.
Некоторые другие способы, по которым объект thread
C++ не будет представлять собой поток выполнения (т.е. Может быть несвязанным):
- Построенный по умолчанию объект
thread
не представляет собой поток выполнения, поэтому он не соединяется. - Поток, который был перемещен из, больше не будет представлять собой поток выполнения, поэтому он не может соединяться.