C ++ 11 безопасно присоединяется к потоку без использования блока try / catch
Согласно документацииВот а такжеВот, метод соединения потока C ++ 11 будет бросатьstd::system_error
еслиjoinable() == false
, Таким образом, естественный способ ожидания выполнения потока - это что-то вроде:
if (thread2.joinable()) thread2.join();
Однако, у этого есть возможность бросить std :: system_error. Предположим, что поток 1 вызывает thread2.joinable (), возвращает true, указывая, что thread2 все еще работает. Затем планировщик приостанавливает поток 1 и переключает контексты в поток 2. Поток 2 завершается, а затем поток 1 возобновляется. Поток 1 вызывает thread2.join (), но thread2 уже завершен, и в результате выдается std :: system_error.
Возможное решение - обернуть все это в блок try:
try {
thread2.join();
catch (std::system_error &e) {}
Но тогда, когда законный std :: system_error брошен, возможно, чтобы указать, что потокне удалось присоединиться, программа продолжается, действуя так, как будто все в порядке. Есть ли правильный способ присоединиться к потоку помимо использования блока try / catch, подобного этому?