Я шел через этот сообщение о переполнении стека, в котором принятый ответ говорит:
what happens to a detached thread when main() exits is:
It continues running (because the standard doesn't say it is stopped), and that's well-defined, as long as it touches neither (automatic|thread_local) variables of other threads nor static objects.
Пока в этот Опубликовать принятый ответ говорит, что
Process terminates when main() exits, and all threads are killed.
Чтобы увидеть поведение, я протестировал приведенный ниже код на g ++ (Ubuntu 4.8.4-2ubuntu1 ~ 14.04.3) 4.8.4, который предполагает, что после выхода из основного потока другой выходной поток также завершается.
#include <iostream>
#include <thread>
#include <unistd.h>
#include <fstream>
using namespace std;
void foo()
{
std::cout<<"Inside foo\n";
int i=0;
ofstream myfile;while(i<10)
{
std::cout<<"Inside while\n";
myfile.open ("/home/abc/example.txt",ios::app);
myfile << "Writing this to a file.\n";
myfile.close();
i++;
sleep(1);
}}
int main()
{
std::thread first (foo);
first.detach();
sleep(5);
return 0;
}
Так почему во многих сообщениях о переполнении стека предполагается, что отдельный поток продолжает работать в фоновом режиме, даже если основной поток завершает работу? В каком состоянии поток отсоединения продолжает работать в фоновом режиме при главном выходе и какое из приведенных выше утверждений верно?
Заранее спасибо.
Стандарт определяет область потока как программу:
1.10 / 1: Поток выполнения (также известный как поток) — это единый поток управления в программа (…) Выполнение всей программы состоит из выполнения всех ее потоков.
Стандарт говорит о отдельных потоках:
30.3.3 / 1: Поток выполнения отсоединяется, когда ни один объект потока не представляет этот поток.
Так что в стандарте нет ничего, что подсказывало бы, что поток может выжить в своей программе.
Если вы хотите, чтобы что-то продолжало работать в фоновом режиме после завершения программы, вам нужно создать или создать отдельный процесс, который будет работать в фоновом режиме со своими собственными ресурсами и потоками.
Других решений пока нет …