首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >pthreads/ wait(&status)

pthreads/ wait(&status)
EN

Stack Overflow用户
提问于 2012-05-23 19:59:18
回答 3查看 1.3K关注 0票数 4

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

代码语言:javascript
复制
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)是指等待到子进程终止。在out情况下,只有在所有连接完成后,它才会终止。也就是说,当值为6时。

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-05-23 20:03:57

以下是您问题的答案:

  1. 父进程中的值将为0,因为当fork发生时,父进程的地址空间在子进程中是重复的(与变量value一起)。因此,虽然子线程中的value发生了更改,但这种更改不会反映在父线程中,因为它们是不同的variables.
  2. Since。不涉及同步,没有办法知道三个子线程以什么顺序更改变量value。具体地说,每个线程都有一个具有不同值的局部temp变量,然后将该变量复制到全局value变量中,但是无法知道线程将以何种顺序使用temp覆盖valuevalue = temp;。因此,它的值在不同的执行过程中可能不同。
票数 3
EN

Stack Overflow用户

发布于 2012-05-23 20:04:37

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

票数 0
EN

Stack Overflow用户

发布于 2012-05-23 20:15:04

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

代码语言:javascript
复制
if(fork_id == 0){
......
......
}

由派生线程的子进程执行。

子进程具有不同的内存副本。因此,增加子代的价值并不意味着增加父代的价值。

并且线程可以访问全局值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10719438

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档