std::jthread::join
void join(); | (начиная с C++20) |
Блокирует текущий поток до завершения выполнения потока, идентифицированного как *this.
Завершение потока, идентифицированного как *this, синхронизируется с соответствующим успешным возвратом из join().
Для самого объекта *this синхронизация не выполняется. Одновременный вызов join() для одного и того же объекта jthread из нескольких потоков приводит к гонке данных и неопределённому поведению.
Параметры
(нет)
Возвращаемое значение
(нет)
Постусловия
joinable() имеет значение false.
Исключения
std::system_error в случае возникновения ошибки.
Условия ошибок
-
resource_deadlock_would_occur, еслиthis->get_id() == std::this_thread::get_id()(обнаружена взаимоблокировка). -
no_such_process, если поток недействителен. -
invalid_argument, еслиjoinable()имеет значениеfalse.
Пример
#include <chrono>
#include <iostream>
#include <thread>
void foo()
{
// simulate expensive operation
std::this_thread::sleep_for(std::chrono::seconds(1));
}
void bar()
{
// simulate expensive operation
std::this_thread::sleep_for(std::chrono::seconds(1));
}
int main()
{
std::cout << "starting first helper...\n";
std::jthread helper1(foo);
std::cout << "starting second helper...\n";
std::jthread helper2(bar);
std::cout << "waiting for helpers to finish..." << std::endl;
helper1.join();
helper2.join();
std::cout << "done!\n";
}
Вывод:
starting first helper... starting second helper... waiting for helpers to finish... done!
Ссылки
- Стандарт C++23 (ISO/IEC 14882:2024):
- 33.4.4.3 Методы [thread.jthread.mem]
- Стандарт C++20 (ISO/IEC 14882:2020):
- 32.4.3.2 Методы [thread.jthread.mem]
См. также
| позволяет потоку выполняться независимо от дескриптора потока (открытая функция-член) |
|
| проверяет, допускает ли поток присоединение, то есть потенциально выполняется ли он в параллельном контексте (открытая функция-член) |
|
Документация C для thrd_join |
|
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/thread/jthread/join