4

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

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。但是为什么呢?wait(&status) 等待子进程终止。在这种情况下,它只会在所有连接完成后才会终止。意思是,当值为 6 时。

其次,在 lineprintf("Second process value: %d", value);中,值可以是 1 到 6。这也很奇怪,因为我们有 join 指令。

4

3 回答 3

3

您的问题的答案:

  1. 该值在父进程中将为 0,因为当fork发生这种情况时,父进程的地址空间在子进程中被复制(连同变量value)。因此,虽然value在孩子身上发生了变化,但这种变化并没有反映在父母身上,因为它们是不同的变量。

  2. 由于不涉及同步,因此无法知道value三个子线程以何种顺序更改变量。具体来说,每个线程都有一个具有不同值的局部temp变量,然后将其复制到全局value变量中,但是这里无法知道线程将以哪个顺序value覆盖tempvalue = temp;. 因此,它的值在执行之间可能会有所不同。

于 2012-05-23T12:03:57.180 回答
0

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

于 2012-05-23T12:04:36.707 回答
0

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

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

is executed by the child which spawned threads.

And child process has different copy of memory. so increasing value in child does not mean the same for parent.

And threads have access to global values.

于 2012-05-23T12:15:03.710 回答