Как заблокировать несколько мьютексов в C (pthreads) и избежать опасности взаимоблокировок / блокировок?

Предположим, у вас есть кусок кода, который выполняется несколькими потоками. Теперь предположим, что каждый из этих потоков хочет заблокировать один и тот же набор мьютексов, скажем, 5, но не в определенном порядке:

Поток 1: mutex1, mutex2, mutex3, mutex4, mutex5

Поток 1: mutex3, mutex2, mutex4, mutex4, mutex1

Теперь, как бы вы избежали мертвых и живых блокировок, если бы вы реализовали функцию, которая берет эти 5 мьютексов и пытается их заблокировать?

Поскольку следует избегать взаимных блокировок, простой список операторов блокировки исключен. Теперь то, о чем я думал, было что-то вроде (псевдокод):

while(true) {
  if(!lock(m1)) { continue; }
  if(!lock(m2)) { unlock(m1); continue; }
  ...
  if(!lock(m5)) { unlock(m1);...;unlock(m4); continue; }
  break;
}

Проблема с этим подходом состоит в том, что он, безусловно, приведет к блокировке и потребит много ресурсов процессора.

Таким образом, единственное решение, которое я придумал, - это снабдить каждый поток номером приоритета и использовать это число, чтобы указать (увеличивающееся) время ожидания в начале цикла:

sleepCounter = 0;
while(true) {
  sleep(sleepCounter);
  sleepCounter += threadPriorityNumber
  // aforementioned code

Что вы думаете об этом решении? Это подходящий подход? Какие у меня есть альтернативы? Есть ли литература по этой проблеме в научном мире?

0 ответов

Другие вопросы по тегам