Я пытаюсь создать модуль межпроцессного взаимодействия в реальном времени.
Чтобы избежать неограниченного инвертирования приоритетов, взаимоблокировок и блокировки цепей, я устанавливаю 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