多线程进程在执行fork后,子进程会继承父进程当前的互斥锁mutex的状态,如果在父进程中锁处于加锁的状态,子进程会继承这个加锁的状态,如果子进程再次尝试加锁,会导致死锁。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/syscall.h>
#include <pthread.h>
#include <thread>
#include <unistd.h>
using namespace std;
pthread_mutex_t mutex;
pid_t gettid()
{
return syscall(SYS_gettid);
}
void t_func(void *arg)
{//线程率先对互斥锁加锁
printf("pid:%u create thread:%d, id:%u\n", getpid(), *(int*)arg, gettid());
pthread_mutex_lock(&mutex);
printf("pid:%u thread:%d, get mutex\n", getpid(), gettid());
sleep(10);
pthread_mutex_unlock(&mutex);
printf("pid:%u thread:%d, release mutex\n", getpid(), gettid());
printf("pid:%u exit thread:%d, id:%u\n", getpid(), *(int*)arg, gettid());
}
int main()
{
int i = 1;
pthread_mutex_init(&mutex, NULL);