问题: 父进程先开启一个子线程,子线程中调用pthread_mutex_lock。再fork子进程,子进程同样调用pthread_mutex_lock ,导致的死锁问题。

sleep() 替换 nanosleep() 纳秒精度
//sleep(1);
struct timespec ts = {1, 0};
nanosleep(&ts, NULL);
一、未调用atfork(),导致子进程调用pthread_mutex_lock 时发生死锁
#include <pthread.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <wait.h>
pthread_mutex_t mutex;
void *another(void *arg)
{
printf("in child thread, lock the mutex\n");
pthread_mutex_lock(&mutex);
printf("parent lock..\n");
sleep(5);
pthread_mutex_unlock(&mutex);
printf("parent unlock..\n");
// 解锁两次,结果未定义
//pthread_mutex_unlock(&mutex

本文探讨了在多线程环境中,由于不当使用fork和pthread_mutex_lock导致的死锁问题。通过分析未调用atfork()时的死锁情况,以及调用atfork()后在prepare、parent和child函数中不同加解锁操作的影响,展示了如何正确使用atfork()避免死锁,确保子进程和父进程对互斥锁的操作同步。

512

被折叠的 条评论
为什么被折叠?



