C ++ 0x библиотека потоков или Boost.thread определяют не шаблонную переменную функцию-шаблон, которая блокирует все мьютексы одновременно, что помогает избежать тупика.
template <class L1, class L2, class... L3>
void lock(L1&, L2&, L3&...);
То же самое может быть применено к не-членной функции шаблона variadic 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?
P.S. Пожалуйста, избегайте публикации сложных решений.
Примечания:
- Я не хочу добавлять больше ограничений, чем те, которые накладывает std :: lock (...).
- std :: lock (...) не позволяет полностью избежать взаимоблокировки. Это просто позволяет избежать мертвой блокировки, если два потока выполняют std :: lock (l1, l2) и другие std :: lock (l2, l1). Этого достаточно, чтобы избежать множества тупиковых ситуаций.