【发布时间】:2011-02-14 18:44:39
【问题描述】:
C++0x 线程库或 Boost.thread 定义了一个非成员可变参数模板函数,该函数一次锁定所有互斥锁,有助于避免死锁。
template <class L1, class L2, class... L3>
void lock(L1&, L2&, L3&...);
同样可以应用于非成员可变参数模板函数 try_lock_until,它锁定所有互斥体直到达到给定时间,这有助于避免像 lock(...) 这样的死锁。
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 提出的建议是合理的?
附:请避免发布复杂的解决方案。
注意事项:
- 我不想添加比 std::lock(...) 施加的约束更多的约束。
- std::lock(...) 不能完全避免死锁。如果两个线程执行 std::lock(l1,l2) 和另一个 std::lock(l2,l1),它只是避免出现死锁。这足以避免很多死锁情况。
【问题讨论】:
-
而且,如果唯一的解决方案是复杂的,它就不会是提交给 Boost 的第一段复杂代码。
-
@James 我的实现遵循与 boost::lock 相同的设计,非常复杂。如果我们使用现有接口进行简单实现,则可以将其提供给用户。如果实现本身就很复杂,最好在 Boost 上引入它(如果功能当然被认为是有用的),因为用户不会自己实现它。
标签: c++ boost synchronization timeout c++11