2017-05-08 62 views
-2

当我运行下面的程序时,输出是5.
为什么5?为什么不是8?以下程序的输出

void *doit(void *vargp) { 
    int i = 3; 
    int *ptr = (int*)vargp; 
    (*ptr)++; 
} 
int main() { 
    int i = 0; 
    pthread_t tid; 
    pthread_create(&tid, NULL, doit, (void*)&i); 
    pthread_join(tid,NULL); 
    i = i + 4; 
    printf("%d",i); 
} 
+2

'int i = 3;'行不做任何事。该行为一个永远不会使用的局部变量赋值。 – user3386109

+2

线程不会添加任何有意义的内容,因此您的问题可以概括为“为什么下面的代码打印5?” 'int i = 0;我++; I = I + 4;'。它确实是因为1 + 4 = 5。 – Lundin

回答

6

在DOIT,i的值从0增加到1在声明

(*ptr)++ 

之后线程完成你的4

i = i + 4; 

增加它所以价值5

2

doit()你已经增加了i 1(通过主函数通过参加),并在线程加入后,你添加了4。

拿到8或者你自己加入3〜传递的参数,而不是仅仅增加它,在doit().

1
  • 在功能DOIT INT I = 3;是doit函数的局部变量,它是 与您在main中声明的i无关。因此,在主要功能中,添加对i没有影响。你可以删除它。

    • 接下来,(* ptr)++增加指向我在main函数中声明的1的指针vargp。所以,在那里我变成了1,接下来你就是增加了4。所以结果是5. 如果你想要8次递增(* ptr)3次或在doit中指定vargp变量为2,那么do(* ptr)++只会出现一次并且看到输出。