¿Es inteligente reemplazar boost:: thread y boost:: mutex con equivalentes de c++11?


Motivación: la razón por la que lo estoy considerando es que mi genius project manager piensa que boost es otra dependencia y que es horrible porque "dependes de ella"(traté de explicar la calidad de boost, luego me rendí después de algún tiempo :( ). La razón más pequeña por la que me gustaría hacerlo es que me gustaría aprender las características de c++11, porque la gente comenzará a escribir código en él. Entonces:

  1. ¿Existe un mapeo 1: 1 entre #include<thread> #include<mutex> y impulsar equivalentes?
  2. ¿Considerarías una buena idea reemplazar boost stuff con c++11
    cosa. Mi uso es primitivo, pero hay ejemplos cuando la ets no ofrecer qué impulso hace? O (blasfemia) viceversa?

P.d. Uso GCC para que los encabezados estén ahí.

Author: PersianGulf, 2011-08-30

6 answers

Hay varias diferencias entre Boost.Thread y la biblioteca de subprocesos estándar de C++11:

  • Boost admite la cancelación de subprocesos, los subprocesos de C++11 no
  • C++11 soporta std::async, pero Boost no
  • Boost tiene un boost::shared_mutex para el bloqueo de lector múltiple/escritor único. El análogo std::shared_timed_mutexestá disponible solo desde C++14 ( N3891), mientras que std::shared_mutexestá disponible solo desde C++17 ( N4508).
  • Los tiempos de espera de C++11 son diferentes para aumentar los tiempos de espera (aunque esto debería cambiar pronto ahora Boost.Chrono ha sido aceptado).
  • Algunos de los nombres son diferentes (por ejemplo, boost::unique_future vs std::future)
  • La semántica de paso de argumentos de std::thread es diferente a boost::thread- - - Boost usa boost::bind, que requiere argumentos copiables. std::thread permite que los tipos de solo movimiento como std::unique_ptr se pasen como argumentos. Debido al uso de boost::bind, la semántica de marcadores de posición como _1 en expresiones de enlace anidadas también puede ser diferente.
  • Si no llama explícitamente join() o detach() entonces el destructor boost::thread y el operador de asignación llamarán a detach() en el objeto thread al que se está destruyendo/asignando. Con un objeto C++11 std::thread, esto resultará en una llamada a std::terminate() y abortará la aplicación.

Para aclarar el punto sobre los parámetros de solo movimiento, lo siguiente es válido C++11, y transfiere la propiedad de int desde el temporal std::unique_ptr al parámetro de f1 cuando se inicia el nuevo subproceso. Sin embargo, si utiliza boost::thread entonces no funcionará, ya que utiliza boost::bind internamente, y std::unique_ptr no se puede copiar. También hay un error en la biblioteca de subprocesos de C++11 provista con GCC que impide que esto funcione, ya que también usa std::bind en la implementación allí.

void f1(std::unique_ptr<int>);
std::thread t1(f1,std::unique_ptr<int>(new int(42)));

Si está utilizando Boost, probablemente pueda cambiar a subprocesos de C++11 relativamente sin dolor si su compilador lo soporta (por ejemplo, las versiones recientes de GCC en linux tienen una implementación casi completa de la biblioteca de subprocesos de C++11 disponible en modo -std=c++0x).

Si su el compilador no soporta subprocesos de C++11, entonces es posible que pueda obtener una implementación de terceros como Just::Thread, pero esto sigue siendo una dependencia.

 179
Author: Anthony Williams,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-11 16:43:26

std::thread se modela en gran medida después de boost::thread, con algunas diferencias :

  • la semántica no copiable de boost, mapas de un manejador a un hilo de sistema operativo, se mantiene. Pero este hilo es móvil para permitir la devolución de hilo de las funciones de fábrica y colocarlo en contenedores.
  • Esta propuesta añade la cancelación a la boost::thread, lo que es una complicación significativa. Este cambio tiene un gran impacto no solo en el subproceso, sino también en el resto de la biblioteca de subprocesos de C++. Se se cree que este gran cambio es justificable debido al beneficio.
    • El destructor de subprocesos ahora debe llamar a cancel antes de separarse para evitar fugas accidentales de subprocesos hijos cuando se cancelan los subprocesos padres.
    • Ahora se requiere un miembro de separación explícito para habilitar la separación sin cancelar.
  • Los conceptos de identificador de hilo e identidad de hilo se han separado en dos clases (son la misma clase en boost::thread). Esto es para apoyar más fácil manipulación y almacenamiento de la identidad del hilo.
  • Se ha agregado la capacidad de crear un id de hilo que se garantiza que se comparará igual a ningún otro hilo ensamblable (boost::thread no tiene esto). Esto es útil para el código que quiere saber si está siendo ejecutado por el mismo hilo que una llamada anterior (los mutexes recursivos son un ejemplo concreto).
  • Existe una "puerta trasera" para obtener el controlador de subprocesos nativo para que los clientes puedan manipular subprocesos utilizando el sistema operativo subyacente si deseable.

Esto es de 2007, por lo que algunos puntos ya no son válidos: boost::thread tiene una función native_handle ahora, y, como señalan los comentaristas, std::thread ya no tiene cancelación.

No pude encontrar ninguna diferencia significativa entre boost::mutex y std::mutex.

 23
Author: Alex B,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-30 11:18:56

Hay una razón para no migrar a std::thread.

Si está utilizando enlaces estáticos, std::thread se vuelve inutilizable debido a estos errores/características de gcc:

Es decir, si se llama a std::thread::detach o std::thread::join se producirá una excepción o un bloqueo, mientras que boost::thread funciona bien en estos casos.

 6
Author: ks1322,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-15 15:28:20

Enterprise Case

Si está escribiendo software para la empresa que necesita ejecutarse en una variedad moderada o grande de sistemas operativos y, en consecuencia, compilar con una variedad de compiladores y versiones de compiladores (especialmente las relativamente antiguas) en esos sistemas operativos, mi sugerencia es mantenerse alejado de C++11 por completo por ahora. Eso significa que no puede usar std::thread, y yo recomendaría usar boost::thread.

Caso de Inicio Básico / Tecnológico

Si usted es escribiendo para uno o dos sistemas operativos, sabe con seguridad que solo necesitará construir con un compilador moderno que soporte principalmente C++11 (por ejemplo, VS2015, GCC 5.3, Xcode 7), y que ya no depende de la biblioteca boost, entonces std::thread podría ser una buena opción.

Mi Experiencia

Personalmente soy parcial a las bibliotecas endurecidas, muy usadas, altamente compatibles y altamente consistentes, como boost versus una alternativa muy moderna. Esto es especialmente cierto para temas de programación complicados como el enhebrado. Además, he experimentado un gran éxito con boost::thread (y boost en general) en una amplia gama de entornos, compiladores, modelos de subprocesos, etc. Cuando es mi elección, elijo impulso.

 5
Author: Nicholas Smith,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-09 01:25:44

Con Visual Studio 2013 el std::mutex parece comportarse de manera diferente que el boost::mutex, lo que me causó algunos problemas (ver esta pregunta).

 3
Author: Robert Hegner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:34:42

Traté de usar shared_ptr desde std en lugar de boost y en realidad encontré un error en la implementación de gcc de esta clase. Mi aplicación estaba fallando debido a que destructor llamó dos veces (esta clase debería ser segura para subprocesos y no debería generar tales problemas). Después de pasar a boost:: shared_ptr todos los problemas desaparecieron. Las implementaciones actuales de C++11 aún no están maduras.

Boost también tiene más características. Por ejemplo, el encabezado en la versión std no proporciona serializador a una transmisión (i. e. cout

Para resumir: si ya tiene una aplicación escrita usando boost, es más seguro mantener su código tal como está en lugar de esforzarse en pasar al estándar C++11.

 0
Author: user3323559,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-28 09:54:01