代码之家  ›  专栏  ›  技术社区  ›  Sharat Chandra

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

  •  5
  • Sharat Chandra  · 技术社区  · 14 年前

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

    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 );
    
    }
    

    variable a ,对吧?

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

    同一进程中的线程共享: 工艺说明书 大多数数据 打开的文件(描述符) 信号和信号句柄 用户和组id

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

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

    2 回复  |  直到 14 年前
        1
  •  4
  •   SingleNegationElimination    14 年前

    即使这不是线程,也不能这样做,因为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 ,因为它在另一个块的本地范围内。这是一个编译时问题,编译器只是不知道你的意思 当你提到它的时候 打印变量 .

    但还有另一个线程问题。当进程的主线程退出时,所有其他线程都将终止(特别是当 任何 线程调用 _exit ,则终止所有线程,并且 _start 电话 之后 主要的 返回)。但调用另一个线程后,main立即返回。为了防止这种情况,你应该打电话 pthread_join 它将等待线程退出,然后返回。会像这样

    int a;
    void* PrintVar(void* arg){
       printf( "%d\n", a);
    }
    
    int main(int argc, char*argv[]) {
       void *dummy;
       a = 10;
    
       pthread_t thr;
       pthread_create( &thr, NULL, PrintVar, NULL );
       pthread_join( thr, &dummy);
    }
    
        2
  •  8
  •   Jeremy Friesner    14 年前

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

    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()返回)