我读到线程共享其父线程的内存地址空间。 如果这是真的,为什么线程函数不能访问属于它的父线程的局部变量?
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
不符合共享变量的条件?
我想看一个共享文件描述符的示例代码
答案 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
中声明的变量名main
在PrintVar
中不可见,因为它位于另一个块的本地范围内。这是一个编译时问题,当您在a
中提及它时,编译器只是不知道PrintVar
的含义。
但还有另一个线程问题。当进程的主线程退出时,所有其他线程都被终止(具体地,当任何线程调用_exit
时,则所有线程都被终止,并且_start
调用{{1在_exit
返回后)。但是你的主要在调用另一个线程后立即返回。为防止这种情况,您应该调用main
,它将在返回之前等待线程退出。这看起来像这样
pthread_join