Вызов join
в теле потока - неопределенное поведение.
Просмотр условий ошибок для join :
Условия ошибок resource_deadlock_would_occur, если это- > get_id () == std :: this_thread :: get_id () (обнаружен тупик)
Ваше тело:
auto wrapped_function = [&function, job_id, this]() {
function();
threads.erase(job_id);
};
, где вы звоните erase
, дтор * Вызывается jthread
, который вызывает join
в присоединяемом потоке.
Вместо join
, в dtor вы должны позвонить detach
.
Чтобы избежать висячей ссылки function
must быть захваченным значением.
Также вы должны добавить мьютекс, чтобы избежать гонки данных на карте, при вызове size
и erase
:
std::mutex m;
int size() {
std::lock_guard<std::mutex> lock{m};
return threads.size();
}
auto wrapped_function = [f = function, job_id, this]() {
f();
std::lock_guard<std::mutex> l(m);
threads.erase(job_id);
};
void wait_for_all() {
while(size() != 0) {}
}
Demo