pthreads / wait(& status)

时间:2012-05-23 11:59:18

标签: c multithreading pthreads

我读了一本书,给出了下一个例子:

int value=0
int thread_func(int id) {
   int temp;
   temp=value+id;
   printf("Thread%d value: %d", id, temp);
   value=temp;
}

int main() {
   int fork_id, status, i;
   pthread_t tids[3];
   fork_id=fork();
 if (fork_id == 0) {
   for (i=1; i≤3; i++) 
        pthread_create(&tids[i-1], NULL, thread_func, i);
      for (i=0; i≤2; i++)
        pthread_join(tids+i, &status);
      printf("Second process value: %d", value);
  }
 else {
  wait(&status);
      printf("First process value: %d", value)
      }

我不明白两个主要的事情: 在我读到的时候,该行在printf("First process value: %d", value)中唯一的值是0。 但为什么?等待(& status)等待子进程终止。在out case中,它将在所有连接完成后终止。意思是,当值为6时。

其次,在行printf("Second process value: %d", value);中,vaule可以是1到6.这也很奇怪,因为我们有连接指令。

3 个答案:

答案 0 :(得分:3)

您的问题的答案:

  1. 父进程中的值为0,因为当fork发生时,父进程的地址空间与子进程中的变量value一起重复。因此,尽管在子项中更改了value,但此更改未反映在父项中,因为它们是不同的变量。

  2. 由于不涉及同步,因此无法知道变量value由三个子线程改变的顺序。具体来说,每个线程都有一个具有不同值的本地temp变量,然后将其复制到全局value变量中,但无法知道线程将覆盖的顺序{{1} } value此处:temp。因此,它的价值可能因执行而异。

答案 1 :(得分:0)

因为当你分叉时,你会得到一个带有自己内存的全新流程,这意味着在一个流程中对变量的更改不会显示在另一个流程中。另一方面,线程共享它们的内存,这意味着线程程序中变量的变化会显示在所有线程中。

答案 2 :(得分:0)

该值由子进程递增,因此父进程将其值显示为0.

if(fork_id == 0){
......
......
}

由生成线程的子项执行。

子进程有不同的内存副本。所以增加孩子的价值对父母来说并不一样。

线程可以访问全局值。