线程如何访问父线程的变量

时间:2010-10-17 04:59:06

标签: multithreading pthreads shared-memory

我读到线程共享其父线程的内存地址空间。 如果这是真的,为什么线程函数不能访问属于它的父线程的局部变量?

void* PrintVar(void* arg){
   printf( "%d\n", a);
}

int main(int argc, char*argv[]) {
   int a;
   a = 10;
   pthread_t thr;
   pthread_create( &thr, NULL, PrintVar, NULL );

}

如果线程共享地址空间,那么PrintVar函数应该能够打印variable a的值,对吧?

我在http://www.yolinux.com/TUTORIALS/LinuxTutorialPosixThreads.html

上阅读了这条信息

同一进程中的线程共享:     流程说明     大多数数据     打开文件(描述符)     信号和信号处理程序     当前的工作目录     用户和组ID

如果确实如此,那么为什么int a不符合共享变量的条件?

我想看一个共享文件描述符的示例代码

2 个答案:

答案 0 :(得分:7)

子线程可以访问父线程堆栈中的变量,只需知道变量的地址即可。例如,您可以这样做:

void* PrintVar(void* arg){
   int * a = (int *) arg;
   printf( "%d\n", *a);
}

int main(int argc, char*argv[]) {
   int a;
   a = 10;
   pthread_t thr;
   pthread_create( &thr, NULL, PrintVar, &a );
}

请注意,这种事情可能很棘手,因为您必须(以这种或那种方式)保证(a)在子线程仍在访问它时不会被销毁。 (在这种情况下,你可能想在main()的末尾调用pthread_join(),这样主线程就会在那里阻塞而不会从main()返回,直到子线程退出为止。

答案 1 :(得分:4)

即使这不是一个主题,你也做不到,因为a超出了范围。

将a放在全局范围内,如下所示:

int a;
void* PrintVar(void* arg){
   printf( "%d\n", a);
}

int main(int argc, char*argv[]) {
   a = 10;
   pthread_t thr;
   pthread_create( &thr, NULL, PrintVar, NULL );

}

这实际上不是线程问题。请考虑以下代码:

void PrintVar(){
   printf( "%d\n", a);
}

int main(int argc, char*argv[]) {
   int a;
   a = 10;
   PrintVar();
}

这显然不起作用,因为a中声明的变量名mainPrintVar中不可见,因为它位于另一个块的本地范围内。这是一个编译时问题,当您在a中提及它时,编译器只是不知道PrintVar的含义。

但还有另一个线程问题。当进程的主线程退出时,所有其他线程都被终止(具体地,当任何线程调用_exit时,则所有线程都被终止,并且_start调用{{1在_exit返回后)。但是你的主要在调用另一个线程后立即返回。为防止这种情况,您应该调用main,它将在返回之前等待线程退出。这看起来像这样

pthread_join