0

我正在尝试制作一个实时的进程间通信模块。

为了避免无限的优先级反转、死锁和链阻塞,我为每个互斥体设置了 PTHREAD_PRIO_PROTECT。

下面是每个互斥锁的初始化方式

pthread_mutexattr_init(&mutexattr);
if (pthread_mutexattr_setpshared(&mutexattr, PTHREAD_PROCESS_SHARED)) {
     std::cout << "pthread_mutexattr_setpshared failed" << std::endl;
     exit(-2);
}
if (pthread_mutexattr_setprotocol(&mutexattr, PTHREAD_PRIO_PROTECT)) {
     std::cout << "Failed to set protocol" << std::endl;
     exit(-2);
}
if (pthread_mutexattr_setprioceiling(&mutexattr, priority)) {//max priority among tasks that can lock 
     std::cout << "set priority ceiling failed" << std::endl;
     exit(-2);
}
pthread_mutex_init(&mutex, &mutexattr);

正好有两个互斥锁(m1 & m2) 有两个以上的线程(t1, t2, ..., tn)

现在我特意给出了一个死锁情况,有些线程先锁m1再锁m2,而其他线程先锁m2再锁m1

并且为每个互斥体设置了优先级上限协议,死锁情况不应该发生但是,它似乎仍然会发生。

你有什么主意吗?我是否错误地执行它?

顺便说一句,每个线程都设置有 SCHED_FIFO 和一些优先级值 1 ~ 95

4

0 回答 0