即使将PTHREAD_PRIO_PROTECT属性设置为mutexes,也会出现死锁现象。

问题描述 投票:0回答:1

我想做一个实时的进程间通信模块,为了避免无限制的优先级反转和死锁,以及链式阻塞,我给每个mutex设置了PTHREAD_PRIO_PROTECT。

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

下面是每个mutex的初始化方法

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

而且每个mutex都设置了优先级上限协议,死锁情况是不应该发生的但是,似乎还是会发生。

你有什么办法吗?我是不是实现错了?

另外每个线程都设置了SCHED_FIFO和一些优先级值1~95。

linux pthreads posix real-time preempt-rt
1个回答
© www.soinside.com 2019 - 2024. All rights reserved.