многопоточность — что отличается между join () и detach () для многопоточности в C ++?

Чем отличается join() а также detach() в многопоточности в C ++?
Есть ли join() убить нить?

13

Решение

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 Объект не представляет поток выполнения, поэтому не является присоединяемым.
  • Поток, из которого был перемещен, больше не будет представлять поток выполнения, поэтому не может быть присоединен.
22

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

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();
}
9

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