C ++ 0x библиотека потоков или Boost.thread определяют не-членную переменную шаблонную функцию, которая блокирует все блокировки, избегая мертвых блокировок.
template <class L1, class L2, class... L3> void lock(L1&, L2&, L3&...);
Несмотря на то, что эта функция помогает избежать взаимоблокировок, стандарт не включает связанную блокировку с областью действия для написания безопасного кода исключения.
{
std::lock(l1,l2);
// do some thing
// unlock li l2 exception safe
}
Это означает, что нам нужно использовать другой механизм в качестве блока try-catch, чтобы сделать безопасный код для исключения или определить нашу собственную блокировку области действия для нескольких мьютексов или даже сделать это
{
std::lock(l1,l2);
std::unique_lock lk1(l1, std::adopted);
std::unique_lock lk2(l2, std::adopted);
// do some thing
// unlock li l2 on destruction of lk1 lk2
}
Почему стандарт не включает блокировку по объему для нескольких мьютексов одного типа, например,
{
std::array_unique_lock<std::mutex> lk(l1,l2);
// do some thing
// unlock l1 l2 on destruction of lk
}
или кортежи мьютексов
{
std::tuple_unique_lock<std::mutex, std::recursive_mutex> lk(l1,l2);
// do some thing
// unlock l1 l2 on destruction of lk
}
Что-то не так в дизайне?
Обновлено: описание из стандарта
template <class L1, class L2, class... L3> void lock(L1&, L2&, L3&...);
Требуется : каждый тип параметра шаблона должен соответствовать требованиям Mutex, за исключением того, что вызов try_-lock () может вызвать исключение. [Примечание: шаблон класса unique_lock удовлетворяет этим требованиям, когда создается соответствующий экземпляр. —Конечная записка]
Эффекты : Все аргументы блокируются с помощью последовательности вызовов lock (), try_lock () или unlock () для каждого аргумента. Последовательность вызовов не должна приводить к тупику, но в остальном не указана. [Примечание: должен использоваться алгоритм предотвращения тупиков, такой как попытка и откат, но конкретный алгоритм не указан, чтобы избежать чрезмерных ограничений реализации. - end note] Если вызов lock () или try_lock () вызывает исключение, unlock () должен вызываться для любого аргумента, заблокированного вызовом lock () или try_lock ().
Я принял ответ. Я понимаю, что главная причина в том, что нет времени, чтобы улучшить библиотеку C ++ 0x Thread. Я надеюсь, что TR2 будет включать в себя гораздо больше вещей.