Чем отличается join()
а также detach()
в многопоточности в C ++?
Есть ли join()
убить нить?
C ++ thread
Объект обычно (но не всегда) представляет поток выполнения, который является концепцией ОС или платформы.
когда thread::join()
вызывается, вызывающий поток будет блокироваться, пока поток выполнения не завершится. По сути, это один из механизмов, который можно использовать, чтобы узнать, когда закончится поток. когда thread::join()
возвращается, поток выполнения ОС завершен и C ++ thread
объект может быть уничтожен.
thread::detach()
называется, поток выполнения «отсоединен» от thread
объект и больше не представлен thread
объект — это две независимые вещи. C ++ thread
объект может быть уничтожен, а поток выполнения ОС может продолжаться. Если программе необходимо знать, когда завершился этот поток выполнения, необходимо использовать какой-то другой механизм. join()
не может быть призван на это thread
объект больше, так как он больше не связан с потоком выполнения.
Уничтожение C ++ считается ошибкой thread
объект, пока он еще «присоединяемый». То есть для того, чтобы уничтожить C ++ thread
либо объект join()
должен быть вызван (и завершен) или detach()
должен быть назван. Если C ++ thread
Объект все еще присоединяемый, когда он уничтожен, будет выдано исключение.
Некоторые другие способы, которые C ++ thread
объект не будет представлять поток выполнения (то есть может быть не присоединяемым):
thread
Объект не представляет поток выполнения, поэтому не является присоединяемым.join()
не убивает нить. На самом деле он ждет, пока не вернется основная функция потока. Так что, если ваша основная функция потока выглядит так:
while (true) {
}
join()
будет ждать вечно.
detatch()
не убивает нить тоже. На самом деле это говорит std::thread
что этот поток должен продолжать работать, даже когда std::thread
Объект уничтожен. C ++ проверяет в деструкторе std :: thread, что поток либо присоединяется, либо отсоединяется, и завершает программу, если эта проверка не удалась.
Так что, если вы раскомментируете первую строку в main
Функция следующего кода будет сбой. Если вы раскомментируете вторую или третью строку, все будет работать нормально.
#include <thread>
void func() {
}
void fail1() {
std::thread t(func);
// will fail when we try to destroy t since it is not joined or detached
}
void works1() {
std::thread t(func);
t.join();
}
void works2() {
std::thread t(func);
t.detach();
}
int main() {
// fail1();
// works1();
// works2();
}