pthread_create fork

场景:进程间同步有关问题(pthread_create中调用fork

进程间同步问题(pthread_create中调用fork)
1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <unistd.h>
  4 #include <pthread.h>
  5 
  6 #define MAX_THREAD_NUM 100 
  7 static int count = 0;
  8 pthread_mutex_t mutex;
  9 static pthread_mutex_t fork_mutex;
 10 void *ThreadFunc(void *arg)
 11 {
 12 pid_t pid;
 13 pid = fork();
 14 int *i = (int*)arg;
 15 if(pid < 0)
 16 {
 17 printf("fork error\n");
 18 exit(0);
 19 }  
 20 if(pid == 0)
 21 {
 22 pthread_mutex_lock(&mutex);
 23 count++;
 24 printf("child%d---count=%d\n",*i,count);
 25 pthread_mutex_unlock(&mutex);
 26 exit(0);
 27 }  
 28 else if(pid > 0)
 29 {
 30 sleep(1);
 31 pthread_mutex_lock(&mutex);
 32 count--;
 33 printf("parent%d---count=%d\n",*i,count);
 34 pthread_mutex_unlock(&mutex);
 35 }  
 36 }  
 37 
 38 int main()
 39 {
 40 int i = 0;
 41 int thread_num = 2;
 42 pthread_t threadid[MAX_THREAD_NUM];
 43 pthread_mutex_init(&mutex,NULL);
 44 pthread_mutex_init(&fork_mutex,NULL);
 45 for(i=0; i<thread_num; i++)
 46 {
 47 pthread_create(&threadid[i],NULL,ThreadFunc,&i);
 48 }
 49 
 50 for(i=0; i<thread_num; i++)
 51 {
 52 pthread_join(threadid[i],NULL);
 53 }
 54 printf("count=%d\n",count);
 55 }

线程函数中调用fork,子进行count++,父进程count--按说最后count值不变,可输出结果如下:
child0---count=1
child0---count=1
parent0---count=-1
parent0---count=-2
count=-2

有没有什么方法实现这种问题的进行间同步


------解决方案--------------------
线程不记得了,隐约记得调用FORK子线程的时候,是对原函数的一种复制,相当于一个副本,进行改变之后对原值不影响。应该是这样,继续关注。
------解决方案--------------------
fork : 子进程拥有父进程的数据段、堆和栈的副本,(相当于新的一个数据段,堆栈)父进程和子进程共享代码段
vfork : 共享父进程的数据段,代码段,由于在vfork后经常是跟着一个exec执行一个新的程序不会在用
到原来的地址空间,
------解决方案--------------------
探讨

引用:
fork : 子进程拥有父进程的数据段、堆和栈的副本,(相当于新的一个数据段,堆栈)父进程和子进程共享代码段
vfork : 共享父进程的数据段,代码段,由于在vfork后经常是跟着一个exec执行一个新的程序不会在用
到原来的地址空间,


fork复制父进程的内存空间
vfork共享父进程的内存空间
是不是这样的???

------解决方案--------------------
线程间因为是共享数据段的,所以你可以通过锁机制来实现同步,可用fork创建子进程时父子进程间由于各自独享进程空间,所以锁机制无效。可以采取以下方法同步:
1、改用vfork,vfor创建的子进程能保证子进程先运行,父进程在vfork后会进入睡眠状态,直到子进程退出或调用exec才被重新调度运行。
2、fork后,父进程调用wait,等待子进程退出后才继续运行。