biblioteca hilo C++ 0x o Boost.thread definen no miembro función de plantilla variadic que bloquear todos bloqueo evitando el bloqueo de muertos.¿Por qué no hay bloqueos de ámbito para múltiples mutexes en C++ 0x o Boost.Thread?
template <class L1, class L2, class... L3> void lock(L1&, L2&, L3&...);
Si bien esta función ayuda a evitar a punto muerto, la norma no incluye el bloqueo de ámbito asociado a escribir el código de seguridad es una excepción.
{
std::lock(l1,l2);
// do some thing
// unlock li l2 exception safe
}
Eso significa que tenemos que utilizar otro mecanismo como el bloque try-catch para hacer que el código de seguridad excepción o definir nuestra propia cerradura con ámbito en varios mutex nosotros mismos o incluso hacer que
{
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
}
Por qué la norma no incluye una cerradura restringidos en múltiples mutexes del mismo tipo, como por ejemplo
{
std::array_unique_lock<std::mutex> lk(l1,l2);
// do some thing
// unlock l1 l2 on destruction of lk
}
o tuplas de mutexes
{
std::tuple_unique_lock<std::mutex, std::recursive_mutex> lk(l1,l2);
// do some thing
// unlock l1 l2 on destruction of lk
}
¿hay algo malo en el diseño?
Actualizado: Descripción de la norma
template <class L1, class L2, class... L3> void lock(L1&, L2&, L3&...);
Requiere: Cada tipo de parámetro de plantilla deberán cumplir los requisitos mutex, excepto que una llamada a try_- bloqueo() puede lanzar una excepción . [Nota: la plantilla de la clase unique_lock cumple estos requisitos cuando se crea una instancia adecuada. -finalizar]
Efectos: Todos los argumentos se bloquean mediante una secuencia de llamadas a lock(), try_lock() o unlock() en cada argumento. La secuencia de llamadas no dará como resultado un interbloqueo, pero de lo contrario no se especificará. [Nota: se debe usar un algoritmo de evitación de interbloqueo, como try-and-back-off, pero el algoritmo específico no se especifica para evitar implementaciones que restringen excesivamente. nota -fin] Si una llamada para bloquear() o try_lock() lanza una excepción, desbloquear() será llamada para cualquier argumento de que había sido bloqueado por una llamada para bloquear() o try_lock().
Acepto la respuesta. Entiendo que la razón principal es porque no hay tiempo suficiente para mejorar la biblioteca de Threads C++ 0x. Espero que TR2 incluya muchas más cosas.
Buena pregunta, no veo por qué no hay un 'scoped_multi_lock (T ...)'. –
De hecho, me parece que las funciones 'lock (...)' están desequilibradas. Por lo menos, también esperaría un 'desbloqueo (...)' equivalente. Sin embargo, parece que el mejor lugar para agregar dicha funcionalidad sería a la clase 'lock_guard'. Donde podría construirse con múltiples bloqueables y desbloquearlos luego de la destrucción. A diferencia de muchas otras clases de plantillas. – GrafikRobot
@Grafik Tienes razón. desbloquear también debe estar en el estándar. La diferencia es que el desbloqueo (...) no puede empatar. –