如果分离的线程在调用线程退出并破坏共享变量后访问共享变量(例如全局变量),多线程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秒后会发生什么?
另一个困惑是,为什么主线程在退出时会清除所有资源?看起来全局变量的生命周期只取决于主线程吗?
答案 0 :(得分:1)
当main()
返回时,或任何线程调用exit()
或_exit()
时,进程退出。
但是,main()
可以致电pthread_exit()
- 这将不终止该流程。根据Linux pthread_exit()
man page:
当线程终止时,进程共享资源(例如,互斥, 条件变量,信号量和文件描述符)不是 已释放,并且不会调用使用atexit(3)注册的函数。
进程中的最后一个线程终止后,进程终止 通过调用退出状态为零的exit(3);从而, 发布进程共享资源并使用注册函数 atexit(3)被称为。
答案 1 :(得分:0)
线程本身没有自己的内存,但与父进程共享内存。他们与父母联系在一起;因此,每当父母去世时,它的子线程也会被杀死。