Как заблокировать несколько мьютексов в 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
Что вы думаете об этом решении? Это подходящий подход? Какие у меня есть альтернативы? Есть ли литература по этой проблеме в научном мире?