如何在C(pthreads)中锁定多个互斥锁并避免死锁/活锁的危险?

时间:2014-05-15 14:37:51

标签: c multithreading locking deadlock livelock

假设您有一段由多个线程运行的代码。现在进一步假设这些线程中的每一个都想要锁定同一组互斥锁,例如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;
}

这种方法的问题在于它肯定会导致活锁并消耗大量的CPU功率。

因此,我提出的唯一解决方案是为每个线程配备一个优先级编号,并使用此编号指定循环开始时的(增加)休眠时间:

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

您对此解决方案有何看法?这是一种合适的方法吗?我有哪些替代品?在科学界有没有关于这个问题的文献?

0 个答案:

没有答案