日期:2014-05-16  浏览次数:20720 次

如何理解父子进程修改共享量的运行结果
相关原始代码如下:
shmid = shmget(size, key, ipc_creat|0777);  
pint = shmat(shmid, 0 , 0);
*pint = 100;
pid = fork();
*pint += 1;
printf("Return o fork success:pid=%d\n",pid);
printf("*pint=%d\n",*pint);

 
运行结果如下:
Return of fork success:pid = 5252

*pint=102
Return of fork success:pid = 0

*pint=102

我的思考:先执行的是父进程,这时*pint值为100,运行后是101;
  后执行的是子进程,这时*pint值为101,运行后是102;
  所以,我脑中的输出结果是:101和102。
问题:怎么都是102?哪里理解不对?如何正确理解?
是在ubuntu12.04上运行的。
感谢先~~~


------解决方案--------------------
并发未同步,行为不可知。

很好理解啊,父子进程都执行完*pint += 1,那么就是102了,然后父子进程都打印啊。
------解决方案--------------------
shmid = shmget(size, key, ipc_creat|0777);
pint = shmat(shmid, 0 , 0);
*pint = 100;
pid = fork();
*pint += 1;
printf("Return o fork success:pid=%d\n",pid);
printf("*pint=%d\n",*pint);

主要是因为这里你使用的是共享内存句柄,实际上一个指向OS系统级全局空间的地址,因此父子进程会操作同一个地址,并获取相同的结果,这也是共享内存设计的出发点。

如果你使用一个非指向共享内存的变量,哪怕是全局变量,其分配的地址在进程自己的空间中,因此操作后,会看到各自的结果。