加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

父子子线程程序的奇怪行为

发布时间:2020-12-15 21:03:33 所属栏目:安全 来源:网络整理
导读:我对下面复制粘贴的程序有疑问.我在这里解释我对程序的理解:在这个程序中,父程序创建一个子程序并等待它完成.然后,孩子创建一个线程并等待它完成.所以,最后,变量’value’在子进程中的值为’5′,在父进程中为’0′,因为实际上有两个变量’value’的副本,一
我对下面复制粘贴的程序有疑问.我在这里解释我对程序的理解:在这个程序中,父程序创建一个子程序并等待它完成.然后,孩子创建一个线程并等待它完成.所以,最后,变量’value’在子进程中的值为’5′,在父进程中为’0′,因为实际上有两个变量’value’的副本,一个在父级,另一个在子级中,因为fork基本上将父地址空间复制到子).但是,父和子中变量’value’的地址结果都是相同的.我不明白怎么做.如果有人能解释这种行为,我将不胜感激.

#include <stdio.h>
#include <pthread.h>


int value = 0;
void *runner( void *param );

int main ()
   {
   int pid ;
   pthread_t tid;
   pthread_attr_t attr;

   pid = fork();

   if( pid == 0 ) /* child */
      {
      pthread_attr_init( &attr );
      pthread_create( &tid,&attr,runner,NULL );
      pthread_join(tid,NULL);
      printf( "CHILD: value = %d,address = %pn",value,&value );
      }
   else if( pid > 0 ) /* Parent */
      {
      wait(NULL);
      printf( "PARENT: value = %d,&value );
      }
   }

void *runner( void *param )
   {
   value = 5;
   pthread_exit(0);
   }

解决方法

现代操作系统为每个进程提供虚拟地址空间,因此重合的地址并不意味着两个变量存储在物理内存的同一目的地上.

此外,大多数操作系统在分叉时使用写时复制技术.这意味着父进程的部分地址空间不会复制到子进程的地址空间,直到子进程尝试更改它们.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读