c++ boost queue stdstring lock-free

c++ - cómo poner std:: string en boost:: lockfree:: queue(o alternativa)?



stdstring lock-free (3)

Estoy intentando poner std::string s en boost::lockfree::queue s para que mis hilos se actualicen entre sí con nuevos datos.

Cuando intento usar boost::lockfree::queue<std::string> updated_data; , g++ dice:

En la creación de instancias de ''clase boost :: lockfree :: queue>'':

error: la aserción estática falló: (boost :: has_trivial_destructor :: value)

error: la aserción estática falló: (boost :: has_trivial_assign :: value)

En general, me han mostrado lo que significan estos errores , pero no tengo ninguna esperanza de solucionarlo yo mismo, ya que soy casi nuevo para c ++.

¿Hay alguna forma alternativa de pasar datos de texto entre hilos con lockfree ? De lo contrario, muéstrame cómo poner std::string en un boost::lockfree::queue .


No tengo ninguna esperanza de solucionarlo yo mismo, ya que soy casi nuevo para c ++.

Entonces me pregunto por qué estás jugando con cosas como colas sin bloqueo.

¿Hay alguna forma alternativa de pasar datos de texto entre hilos con lockfree ?

Sí, podría simplemente almacenar un puntero std::string* a los datos en la cola, porque un puntero es un tipo trivial y, por lo tanto, está permitido en la cola. De forma equivalente, puede almacenar un reference_wrapper<std::string> . El problema con eso es que necesitas almacenar las cadenas en otro lugar, para poder apuntarlas, así que ahora todo lo que has hecho es mover el problema a otro lugar (por ejemplo, podrías mantener una lista de cadenas en cada hilo y almacenar punteros a la cadena administrada externamente en la cola libre de bloqueos, pero no sabe cuándo es seguro eliminar una string de la lista por subproceso para que crezca y crezca).

Le sugiero que use un simple std::queue<std::string> y realice su propia sincronización con un boost::mutex y boost::condition_variable , o encuentre una implementación existente de un thread-safe (¡no bloqueable! ) cola.


La documentación boost::lockfree::queue establece claramente que el elemento contenido debe tener una asignación de copia trivial y destructor, que std::string no tiene.

Si tiene un único productor y un solo consumidor, puede usar spsc_queue ( http://www.boost.org/doc/libs/1_54_0/doc/html/boost/lockfree/spsc_queue.html ) que solo requiere constructabilidad y capacidad de copia de seguridad predeterminadas. .

Si tiene múltiples productores o consumidores, se encontrará con una cola de bloqueo normal (o una cadena personalizada que no usa asignación dinámica).


Si coloca punteros sin formato en la cola, se perderán las viejas std::strings estándar, ya que no hay forma de liberarlas cuando ya no las necesiten. Esto se debe a que no hay forma de liberar los objetos de una manera segura para hilos sin necesidad de utilizar un candado (a excepción de algunos trucos como los indicadores de peligro, que boost::lockfree::queue no usa)

Por razones técnicas que realmente no entiendo, el boost::lockfree::queue requiere un operador de asignación trivial y un destructor trivial, lo que significa que su objeto no puede contener ni contener ningún tipo de datos que deba liberar memoria en su destructor, como std::string