进程间同步新开讨论帖
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#define MAX_THREAD_NUM 100
static int count = 0;
pthread_mutex_t mutex;
static pthread_mutex_t fork_mutex;
void *ThreadFunc(void *arg)
{
pid_t pid;
pid = vfork();
int *i = (int*)arg;
if(pid < 0)
{
printf("fork error\n");
exit(0);
}
if(pid == 0)
{
pthread_mutex_lock(&mutex);
execl("/bin/pwd","pwd",NULL);count++;
printf("child%d---count=%d\n",*i,count);
pthread_mutex_unlock(&mutex);
exit(0);
}
else if(pid > 0)
{
sleep(1);
pthread_mutex_lock(&mutex);
count--;
printf("parent%d---count=%d\n",*i,count);
pthread_mutex_unlock(&mutex);
}
waitpid(pid);
}
int main()
{
int i = 0;
int thread_num = 5;
pthread_t threadid[MAX_THREAD_NUM];
pthread_mutex_init(&mutex,NULL);
for(i=0; i<thread_num; i++)
{
pthread_create(&threadid[i],NULL,ThreadFunc,&i);
}
for(i=0; i<thread_num; i++)
{
pthread_join(threadid[i],NULL);
}
printf("count=%d\n",count);
}
这代码出现死锁,运行结果为:
$ ./thread_fork
/home/node104/jzhe/he/code
注意标红的两行,如果把那两行顺序调换一下的话,即改为:
execl("/bin/pwd","pwd",NULL);
pthread_mutex_lock(&mutex);
count++;
此时输出结果为:
/home/node104/jzhe/he/code
/home/node104/jzhe/he/code
/home/node104/jzhe/he/code
/home/node104/jzhe/he/code
/home/node104/jzhe/he/code
parent0---count=-1
parent1---count=-2
parent1---count=-3
parent3---count=-4
parent4---count=-5
count=-5
第一种情况出现死锁第二种好像没有死锁,但两种情况下子进行都没有执行(输出结果中没有child---信息)
count++;
printf("child%d---count=%d\n",*i,count);
为什么会这样
[解决办法]
pthread_mutex_t是线程的同步,在进程中是没有任何意义的。只是浪费了CPU时间而已。
pthread_mutex_t 一 fork, 就有两份了。独立的。
不建议你这么用 在线程里面创建进程。
如果我没分析错的话,会产生一个 蛋生鸡,鸡生蛋 的永久循环。是一个死结!