线程在主线程退出后访问共享变量

时间:2015-06-07 23:48:00

标签: c++ multithreading detach

如果分离的线程在调用线程退出并破坏共享变量后访问共享变量(例如全局变量),多线程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秒后会发生什么?

另一个困惑是,为什么主线程在退出时会清除所有资源?看起来全局变量的生命周期只取决于主线程吗?

2 个答案:

答案 0 :(得分:1)

main()返回时,或任何线程调用exit()_exit()时,进程退出。

但是,main()可以致电pthread_exit() - 这将终止该流程。根据Linux pthread_exit() man page

  

当线程终止时,进程共享资源(例如,互斥,   条件变量,信号量和文件描述符)不是   已释放,并且不会调用使用atexit(3)注册的函数。

     

进程中的最后一个线程终止后,进程终止   通过调用退出状态为零的exit(3);从而,   发布进程共享资源并使用注册函数   atexit(3)被称为。

答案 1 :(得分:0)

线程本身没有自己的内存,但与父进程共享内存。他们与父母联系在一起;因此,每当父母去世时,它的子线程也会被杀死。