доступ к переменным общего доступа после выхода из основного потока

Что произойдет в многопоточной программе на 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 секунды, если отдельный дочерний поток попытается получить доступ к этой глобальной переменной?

И еще одна путаница: почему главный поток очищает все ресурсы при выходе? Похоже, время жизни глобальной переменной зависит только от основного потока?

3

Решение

Процессы завершаются, когда main() возвращает или любой поток вызовов exit() или же _exit(),

Тем не мение, main() может позвонить pthread_exit() — и это будет не прекратить процесс. По Linux pthread_exit() справочная страница:

Когда поток завершается, ресурсы, совместно используемые процессом (например, мьютексы,
переменные условия, семафоры и файловые дескрипторы) не являются
освобождены, а функции, зарегистрированные с помощью atexit (3), не вызываются.

После того, как последний поток в процессе завершается, процесс завершается
как при вызове exit (3) со статусом выхода ноль; Таким образом,
Ресурсы, совместно используемые процессом, освобождаются, а функции регистрируются
Атексит (3) называется.

1

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

Потоки не имеют собственной памяти как таковой, но совместно используют память со своим родительским процессом. Они привязаны к своим родителям; следовательно, всякий раз, когда родитель умирает, его дочерние потоки также уничтожаются.

0

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