是否有一个简单的定时锁定算法,以避免多个互斥锁上的死锁?

时间:2010-05-02 15:04:35

标签: c++ boost synchronization timeout c++11

C ++ 0x线程库或Boost.thread定义了一个非成员的可变参数模板函数,它可以立即锁定所有互斥锁,有助于避免死锁。

template <class L1, class L2, class... L3> 
void lock(L1&, L2&, L3&...);

同样可以应用于非成员可变参数模板函数try_lock_until,它会锁定所有互斥锁,直到达到给定时间,这有助于避免像锁(...)这样的死锁。

template <class Clock, class Duration,
          class L1, class L2, class... L3> 
void try_lock_until(
          const chrono::time_point<Clock,Duration>& abs_time, 
          L1&, L2&, L3&...);

我的实现遵循与Boost函数boost :: lock(...)相同的设计。但这很复杂。

因为我可能会遗漏一些明显的东西,我想知道是否:

有一个简单的定时锁定算法可以避免多个互斥锁上的死锁吗?

如果不存在简单的实现,这可以证明Boost的提案是合理的吗?

P.S。请避免发布复杂的解决方案。


注意:

  1. 我不想添加比std :: lock(...)强加的更多约束。
  2. std :: lock(...)不能完全避免死锁。如果两个线程执行std :: lock(l1,l2)而另一个执行std :: lock(l2,l1),则只是避免死锁。这足以避免很多死锁案件。

2 个答案:

答案 0 :(得分:4)

经典(和最佳)方法是定义锁定互斥锁的顺序,并确保一次拥有多个锁定互斥锁的任何代码始终按此顺序锁定其互斥锁。这种方法在这里不够吗?

答案 1 :(得分:0)

我能想到的最简单,虽然需要认真考虑正确性,但是所有互斥锁定都是全局排序。实现将是在创建时为互斥锁提供序列号。然后,当一个人将它们锁定为一个集合时,您可以按该序列号对它们进行排序,然后按顺序锁定它们。不需要特殊类型的锁,因为这可以保证全局一致的锁定顺序。