Припустимо, я починаю a, std::thread
а потім detach()
це, тому нитка продовжує виконувати, навіть незважаючи на std::thread
те, що колись її представляла, виходить за межі області.
Припустимо також, що програма не має надійного протоколу для приєднання від'єднаного потоку 1 , тому відокремлена нитка все ще працює при main()
виході.
Я нічого не можу знайти у стандарті (точніше, у проекті N3797 C ++ 14), який описує, що має відбутися, ані 1.10, ані 30.3 не містять відповідних формулювань.
1 Ще одне, напевно, еквівалентне питання: "чи може від'єднаний потік коли-небудь приєднатися знову", тому що який би протокол ви не придумали приєднати, сигналізаційну частину потрібно було б виконати, поки потік ще працює, і планувальник ОС може вирішити покласти нитку спати на годину одразу після того, як сигналізація була виконана, але жодним чином для кінця прийому надійно не визначити, що нитка фактично закінчена.
Якщо у запущених main()
відокремлених потоків працює невизначена поведінка, то будь-яке використання std::thread::detach()
не визначеної поведінки, якщо основна нитка ніколи не виходить 2 .
Таким чином, вичерпання запущених main()
відокремлених потоків повинно мати визначені ефекти. Питання: де (у стандарті C ++ , а не POSIX, не в документах ОС, ...) визначені ці ефекти.
2 Від'єднану нитку не можна з'єднати (в сенсі std::thread::join()
). Ви можете дочекатися результатів від відокремлених потоків (наприклад, через майбутнє від std::packaged_task
, або за допомогою підрахунку семафору, прапора та змінної умови), але це не гарантує, що потік завершено виконувати . У самому справі, якщо не поставити сигналізацію частини в деструктор першого автоматичного об'єкта потоку, там буде , взагалі кажучи , код (деструктори) , які виконуються після коду сигналізації. Якщо ОС планує основний потік, щоб споживати результат і виходити до того, як відокремлений потік закінчить роботу зазначених деструкторів, що буде ^ WS визначено?
std::exit
або виходом з ньогоmain
є достатнім, але не необхідним, щоб задовольнити ці вимоги." (весь абзац може бути відповідним) Також дивіться [support.start.term] / 8 (std::exit
називається, колиmain
повертається)