#include <unistd.h>
#include <pthread.h>
#include <stdio.h>
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
void* thread_fun(void* arg)
{
sleep(1);
pid_t pid;
pid = fork();
if (pid == 0)
{
pthread_mutex_lock(&mutex);
printf("child\n");
pthread_mutex_unlock(&mutex);
}
if (pid > 0)
{
pthread_mutex_lock(&mutex);
printf("parent\n");
pthread_mutex_unlock(&mutex);
}
}
int main()
{
pthread_t tid;
if (pthread_create(&tid, NULL, thread_fun, NULL))
{
printf("create new thread failed\n");
return;
}
pthread_mutex_lock(&mutex);
sleep(2);
pthread_mutex_unlock(&mutex);
printf("main\n");
pthread_join(tid, NULL);
return;
}
输出结果:
#include <unistd.h>
#include <pthread.h>
#include <stdio.h>
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
void* thread_fun(void* arg)
{
sleep(1);
printf("new thread\n");
pid_t pid;
pthread_mutex_lock(&mutex);
pid = fork();
if (pid == 0)
{
pthread_mutex_unlock(&mutex);
printf("child\n");
}
if (pid > 0)
{
pthread_mutex_unlock(&mutex);
printf("parent\n");
}
}
int main()
{
pthread_t tid;
if (pthread_create(&tid, NULL, thread_fun, NULL))
{
printf("create new thread failed\n");
return;
}
printf("main\n");
pthread_join(tid, NULL);
return;
}
/*
1. prepare 在调用fork之前会被调用
2. parent 在fork返回之前被调用
3. child 在fork返回子进程之前被调用
*/
#include <unistd.h>
#include <pthread.h>
#include <stdio.h>
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
void prepare()
{
pthread_mutex_lock(&mutex);
printf("I'm prepare\n");
}
void parent()
{
pthread_mutex_unlock(&mutex);
printf("I'm parent\n");
}
void child()
{
pthread_mutex_unlock(&mutex);
printf("I'm child\n");
}
void* thread_fun(void* arg)
{
sleep(1);
pid_t pid;
pthread_atfork(prepare, parent, child);
pid = fork();
if (pid == 0)
{
pthread_mutex_lock(&mutex);
printf("child\n");
pthread_mutex_unlock(&mutex);
}
if (pid > 0)
{
pthread_mutex_lock(&mutex);
printf("parent\n");
pthread_mutex_unlock(&mutex);
}
}
int main()
{
pthread_t tid;
if (pthread_create(&tid, NULL, thread_fun, NULL))
{
printf("create new thread failed\n");
return;
}
pthread_mutex_lock(&mutex);
sleep(2);
printf("main\n");
pthread_mutex_unlock(&mutex);
pthread_join(tid, NULL);
return;
}