【发布时间】:2015-06-07 23:47:59
【问题描述】:
如果分离线程在调用线程退出后访问共享变量(例如全局变量)并破坏共享变量,在多线程 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秒后会发生什么?
另一个困惑是,为什么主线程退出时会清除所有资源?好像全局变量的生命周期只依赖于主线程?
【问题讨论】:
-
当主线程退出时,它也会破坏 t。如果你想让某些东西比 main 更长寿,请使用 fork。
-
线程函数中的
printf()语句在哪里? -
printf() 语句并不是每次都在shell中输出。有时它会打印出“开始线程”。我认为这取决于两个线程的调度顺序。
标签: c++ multithreading detach