我读了一本书,给出了下一个例子:
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.这也很奇怪,因为我们有连接指令。
答案 0 :(得分:3)
您的问题的答案:
父进程中的值为0,因为当fork
发生时,父进程的地址空间与子进程中的变量value
一起重复。因此,尽管在子项中更改了value
,但此更改未反映在父项中,因为它们是不同的变量。
由于不涉及同步,因此无法知道变量value
由三个子线程改变的顺序。具体来说,每个线程都有一个具有不同值的本地temp
变量,然后将其复制到全局value
变量中,但无法知道线程将覆盖的顺序{{1} } value
此处:temp
。因此,它的价值可能因执行而异。
答案 1 :(得分:0)
因为当你分叉时,你会得到一个带有自己内存的全新流程,这意味着在一个流程中对变量的更改不会显示在另一个流程中。另一方面,线程共享它们的内存,这意味着线程程序中变量的变化会显示在所有线程中。
答案 2 :(得分:0)
该值由子进程递增,因此父进程将其值显示为0.
if(fork_id == 0){
......
......
}
由生成线程的子项执行。
子进程有不同的内存副本。所以增加孩子的价值对父母来说并不一样。
线程可以访问全局值。