многопоточность — освобождение ресурсов для отсоединения потока в переполнении стека

Я шел через этот сообщение о переполнении стека, в котором принятый ответ говорит:

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;
}

Так почему во многих сообщениях о переполнении стека предполагается, что отдельный поток продолжает работать в фоновом режиме, даже если основной поток завершает работу? В каком состоянии поток отсоединения продолжает работать в фоновом режиме при главном выходе и какое из приведенных выше утверждений верно?

Заранее спасибо.

2

Решение

Стандарт определяет область потока как программу:

1.10 / 1: Поток выполнения (также известный как поток) — это единый поток управления в программа (…) Выполнение всей программы состоит из выполнения всех ее потоков.

Стандарт говорит о отдельных потоках:

30.3.3 / 1: Поток выполнения отсоединяется, когда ни один объект потока не представляет этот поток.

Так что в стандарте нет ничего, что подсказывало бы, что поток может выжить в своей программе.

Если вы хотите, чтобы что-то продолжало работать в фоновом режиме после завершения программы, вам нужно создать или создать отдельный процесс, который будет работать в фоновом режиме со своими собственными ресурсами и потоками.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector