Что произойдет в многопоточной программе на C ++, если отдельный поток обращается к общим переменным (например, к глобальной переменной) после выхода из потока вызовов и уничтожает общую переменную?
class A {
public:
A() { printf("Constructing A\n"); }
~A() { printf("Destructing A\n"); }
void printSomething() { printf("A is printing\n"); }
}
A a;
void thread_func() {
printf("begin thread.\n");
sleep(3); // make sure main thread exit first
a.printSomething();
printf("ending thread");
}
int main(int argc, char** argv) {
std::thread t(thread_func);
t.detach();
return 0;
}
Программа производит:
bash$ ./a.out
Constructing A
Destructing A
bash$
Кажется, основной поток создал глобальную переменную a и уничтожил ее при выходе. Что произойдет через 3 секунды, если отдельный дочерний поток попытается получить доступ к этой глобальной переменной?
И еще одна путаница: почему главный поток очищает все ресурсы при выходе? Похоже, время жизни глобальной переменной зависит только от основного потока?
Процессы завершаются, когда main()
возвращает или любой поток вызовов exit()
или же _exit()
,
Тем не мение, main()
может позвонить pthread_exit()
— и это будет не прекратить процесс. По Linux pthread_exit()
справочная страница:
Когда поток завершается, ресурсы, совместно используемые процессом (например, мьютексы,
переменные условия, семафоры и файловые дескрипторы) не являются
освобождены, а функции, зарегистрированные с помощью atexit (3), не вызываются.После того, как последний поток в процессе завершается, процесс завершается
как при вызове exit (3) со статусом выхода ноль; Таким образом,
Ресурсы, совместно используемые процессом, освобождаются, а функции регистрируются
Атексит (3) называется.
Потоки не имеют собственной памяти как таковой, но совместно используют память со своим родительским процессом. Они привязаны к своим родителям; следовательно, всякий раз, когда родитель умирает, его дочерние потоки также уничтожаются.