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