2

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

您如何看待这个解决方案?这是一个合适的方法吗?我有哪些选择?科学界有没有关于这个问题的文献?

4

0 回答 0