假设您有一段由多个线程运行的代码。现在进一步假设这些线程中的每一个都想要锁定同一组互斥锁,例如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
您对此解决方案有何看法?这是一种合适的方法吗?我有哪些替代品?在科学界有没有关于这个问题的文献?