Метод join
Метод join класса thread блокирует
текущий поток (обычно главный) до тех пор, пока
поток, для которого вызван метод, не завершит
свое выполнение. Метод не принимает параметров
и не возвращает значения. После успешного вызова
join поток становится не присоединяемым,
то есть повторный вызов join или
detach для него приведет к ошибке. Если
поток не был запущен или уже был присоединен
или отсоединен, вызов join приводит к
исключению std::system_error.
Синтаксис
thread.join()
Пример
Давайте создадим поток, который выведет
сообщение, и дождемся его завершения с помощью
метода join:
#include <iostream>
#include <thread>
using namespace std;
void printMessage()
{
cout << "Hello from thread!" << endl;
}
int main()
{
thread t(printMessage);
t.join();
cout << "Main thread finished" << endl;
return 0;
}
Результат выполнения кода:
"Hello from thread!"
"Main thread finished"
Пример
Давайте создадим два потока и дождемся завершения каждого из них по очереди:
#include <iostream>
#include <thread>
using namespace std;
void printA()
{
cout << "Thread A" << endl;
}
void printB()
{
cout << "Thread B" << endl;
}
int main()
{
thread t1(printA);
thread t2(printB);
t1.join();
t2.join();
cout << "All threads finished" << endl;
return 0;
}
Результат выполнения кода:
"Thread A"
"Thread B"
"All threads finished"
Пример
Давайте проверим, можно ли присоединить поток
перед вызовом join с помощью метода
joinable:
#include <iostream>
#include <thread>
using namespace std;
void worker()
{
cout << "Worker running" << endl;
}
int main()
{
thread t(worker);
if (t.joinable())
{
t.join();
}
cout << "Joinable after join: " << t.joinable() << endl;
return 0;
}
Результат выполнения кода:
"Worker running"
"Joinable after join: 0"