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创建子进程时父子进程间由于各自独享进程空间,所以锁机制无效。可以采取以下方法同步:
1、改用vfork,vfor创建的子进程能保证子进程先运行,父进程在vfork后会进入睡眠状态,直到子进程退出或调用exec才被重新调度运行。
2、fork后,父进程调用wait,等待子进程退出后才继续运行。
进程间同步问题(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创建子进程时父子进程间由于各自独享进程空间,所以锁机制无效。可以采取以下方法同步:
1、改用vfork,vfor创建的子进程能保证子进程先运行,父进程在vfork后会进入睡眠状态,直到子进程退出或调用exec才被重新调度运行。
2、fork后,父进程调用wait,等待子进程退出后才继续运行。