我什至不敢问这个问题,因为我认为实验结果会非常明显。
我打算演示跨线程更新全局变量的潜在陷阱。我希望该值会增加(即使只有1)。
但是结果是它似乎根本没有更新,关于线程间数据共享的方式,我遗漏了什么?
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
int global = 0;
void child_code(int i)
{
sleep(i);
global++;
printf("Child %d: global=%p/%d\n", i, &global, global);
}
int main()
{
pid_t pid;
int i, num_children;
num_children = 10;
for (i=0; i<num_children; i++) {
pid = fork();
if (pid == -1) exit(1);
/* see if we're the parent or the child */
if (pid == 0) {
child_code(i);
exit(i);
}
}
/* parent continues */
for (i=0; i<num_children; i++) {
pid = wait(NULL);
}
printf("Parent: global=%p/%d\n", &global, global);
exit(0);
}
以下是示例输出:
Child 1: global=0x10a5d7038/1
Child 2: global=0x10a5d7038/1
Child 3: global=0x10a5d7038/1
Child 4: global=0x10a5d7038/1
Child 5: global=0x10a5d7038/1
Child 6: global=0x10a5d7038/1
Child 7: global=0x10a5d7038/1
Child 8: global=0x10a5d7038/1
Child 9: global=0x10a5d7038/1
Parent: global=0x10a5d7038/0
答案 0 :(得分:2)
fork()
不会创建线程,而是创建具有单独内存段的单独进程。更准确地说,在Linux上,它会克隆当前进程并将所有数据段页面标记为“写时复制”,这就是为什么一旦子进程尝试写入变量,它就会获得该变量的自己的副本以及自己的副本。它所在的内存页面。