Код: Выделить всё
terminate_thread = false;
threadhandle = std::make_shared([this]{MyProg::backgroundThread();});
Код: Выделить всё
terminate_thread = true;
threadhandle->join();
Во время работы моей программы (которая может длиться несколько недель) она может собирать множество фоновых потоков (если нагрузка меняется). Когда фоновые потоки обнаружат, что им не так уж много работы (или если им будет приказано завершить работу), они выйдут из функции.
Если бы я делал это с помощью fork()< /code> разветвленные процессы остаются в таблице процессов как «зомби» до тех пор, пока не потребляют конечный (хотя и большой) ресурс. Родительский процесс уведомляется об этом с помощью сигнала, и таких зомби следует очистить, например. подождите(). Альтернативно вы можете waitpid(pid, &status, WNOHANG); . Любой из них также позволяет родительскому процессу обновлять список процессов, которые все еще выполняются.
Как узнать, какие потоки завершены? Нужно ли мне присоединяться к ним или я могу просто удалить их из своего списка?
Я открыт для любого метода, отличного от std::vector потоков, при условии, что я могу увеличить и динамически уменьшать количество потоков. Все потоки используют одну и ту же функцию. Никакой информации не нужно передавать между фоновыми потоками и основной программой (или наоборот) или между потоками (поскольку я обрабатываю файлы, файлы заблокированы).
Я довольно новичок в C++ и потоках.
Я пишу/компилирую/запускаю это в Linux.
Я попробовал threadhandle.use_count() и threadhandle. unique() threadhandle.joinable(), который всегда возвращает 1, true и true, даже после завершения потока.
Если я вызываю threadhandle.join(), мой основной поток заблокирован.
Если я вызову detach(), я не смогу присоединиться(), когда буду готов завершить работу. Для завершения потоков может потребоваться некоторое время (до 30 секунд), я определенно хочу, чтобы у них была возможность завершиться.
Если я просто соберу их все, у меня может быть очень длинный список в конце (я больше привык к fork(), который оставляет процессы Zombie, если вы их не очистите).
Я искал в Google и stackoverflow. Есть полезные примеры на Java и C#, но нет на C++.
В документации я не нашел способа использовать std::thread - std::thread, похоже, не имеет "состояния" " (или способ получения состояния).
Я понимаю, что могу передать одну переменную каждому потоку, чтобы они могли сказать, когда они завершат работу; это похоже на большие накладные расходы на то, что, как я ожидал, будет встроено. Он также не будет обрабатываться, если поток неожиданно завершится, например. исключение.
Подробнее здесь: https://stackoverflow.com/questions/786 ... ed-threads
Мобильная версия