我读了一本书,它给出了下一个例子:
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指令。
发布于 2012-05-23 20:03:57
以下是您问题的答案:
fork发生时,父进程的地址空间在子进程中是重复的(与变量value一起)。因此,虽然子线程中的value发生了更改,但这种更改不会反映在父线程中,因为它们是不同的variables.value。具体地说,每个线程都有一个具有不同值的局部temp变量,然后将该变量复制到全局value变量中,但是无法知道线程将以何种顺序使用temp覆盖value:value = temp;。因此,它的值在不同的执行过程中可能不同。发布于 2012-05-23 20:04:37
因为当你派生的时候,你会得到一个全新的进程,它有自己的内存,这意味着一个进程中变量的变化不会出现在另一个进程中。另一方面,线程共享它们的内存,这意味着对线程程序中变量的更改会显示在所有线程中。
发布于 2012-05-23 20:15:04
该值由子进程递增,因此父进程将其值显示为0。
if(fork_id == 0){
......
......
}由派生线程的子进程执行。
子进程具有不同的内存副本。因此,增加子代的价值并不意味着增加父代的价值。
并且线程可以访问全局值。
https://stackoverflow.com/questions/10719438
复制相似问题