¿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:
- ¿Existe un mapeo 1: 1 entre
#include<thread> #include<mutex>
y impulsar equivalentes? - ¿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í.
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álogostd::shared_timed_mutex
está disponible solo desde C++14 ( N3891), mientras questd::shared_mutex
está 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
vsstd::future
) - La semántica de paso de argumentos de
std::thread
es diferente aboost::thread
- - - Boost usaboost::bind
, que requiere argumentos copiables.std::thread
permite que los tipos de solo movimiento comostd::unique_ptr
se pasen como argumentos. Debido al uso deboost::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()
odetach()
entonces el destructorboost::thread
y el operador de asignación llamarán adetach()
en el objeto thread al que se está destruyendo/asignando. Con un objeto C++11std::thread
, esto resultará en una llamada astd::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.
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
.
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.
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.
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).
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.
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