今天在验证tcp服务器多线程/进程代码的时候,出现这样的情况:主线程创建一个新线程/进程,并将一个整形参数通过指针形式传递给新的线程,新线程使用新的变量接收参数,同时主线程也会继续对这个参数进行修改。

附上修改前代码:

void func(void *arg)

{

  int i = *(int *)arg; //取出参数

  printf(“i = %d \n”,i);

}

void main(void)

{

  int fd,accept_fd,pid;

  pthread_t func_t;

  fd = socket(AF_INET,SOCK_STREAM,0);

  ………….

  accept_fd = accept(fd,(struct sockaddr*)&client_addr,&client_len);

  if(accept_fd < 0)

    break;

  pid = fork();

  if(-1 == pid)

  {

    close(accept_fd);

    break;

  }

  else if(0 == pid)

  {

    close(fd);

    pthread_create(&func_t,NULL,func,(void*)&accept_fd); //创建线程并将参数给线程

  }else

  {

    close(accept_fd); //这里会改变accept_fd参数,开始认为这里不会影响新线程的参数接收,但最终还是被修改了

  }

  close(fd);

}

修改后代码:

void func(void *arg)

{

  int i = *(int *)arg; //取出参数

  printf(“i = %d \n”,i);

}

void main(void)

{

  int fd,accept_fd,pid;

  pthread_t func_t;

  fd = socket(AF_INET,SOCK_STREAM,0);

  ………….

  accept_fd = accept(fd,(struct sockaddr*)&client_addr,&client_len);

  if(accept_fd < 0)

    break;

  pid = fork();

  if(-1 == pid)

  {

    close(accept_fd);

    break;

  }

  else if(0 == pid)

  {

    close(fd);

    pthread_create(&func_t,NULL,func,(void*)&accept_fd); //创建线程并将参数给线程

    pthread_join(&func_t,NULL); //这里等待新线程运行结束,这样就不会被主线程修改参数了

  }else

  {

    close(accept_fd); //这里会改变accept_fd参数,开始认为这里不会影响线程的参数接收

  }

  close(fd);

}

版权声明:本文为PanShen原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/PanShen/p/9794081.html