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:2023):
- 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/w/cpp/thread/jthread/join