我正在尝试制作一个实时的进程间通信模块。
为了避免无限的优先级反转、死锁和链阻塞,我为每个互斥体设置了 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