Явление тупика, даже когда атрибут PTHREAD_PRIO_PROTECT установлен на мьютексы - PullRequest
0 голосов
/ 29 апреля 2020

Я пытаюсь создать модуль межпроцессного взаимодействия в реальном времени.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...