Pasar un puntero inteligente Boost a la función de subproceso

Tengo una situación en la que se debe pasar algún objeto como argumento de una función de devolución de llamada de subproceso. El objeto se crea dinámicamente y después de que se pasa al subproceso, el objeto ya no es necesario/utilizado en ese contexto (en un método que inicia un subproceso). La función Thread es ahora el único contexto que debe poseer el objeto.

Suponiendo que quiero usar algún puntero inteligente Boost (en lugar de pasar al hilo un puntero sin formato), ¿cuál sería el más apropiado aquí? ¿Cuál es la mejor práctica en este caso?

Lo que realmente necesito es std::auto_ptr con su semántica de movimiento a través del constructor de copias. Creo que este puntero inteligente encajaría perfectamente aquí, pero está obsoleto por razones bien conocidas (y no puedo confiar en tr1 y C++11 punteros; debe (y quiere) usar Boost solo que este código se comparte entre proyectos que deben compilar ambos en Visual Studio 2008 y 2010).

boost::shared_ptr es una opción: podría pasarlo por valor, pero creo que sería excesivo. ¿Hay alguna posibilidad de emular la semántica de movimiento (de forma segura) con boost::scoped_ptr? No necesito el recuento de referencias aquí, ya que no estoy compartiendo un objeto entre dos contextos, solo quiero transferir la propiedad sobre el objeto de un contexto a otro.

preguntado el 22 de mayo de 12 a las 17:05

2 Respuestas

Podrías usar impulso::interproceso::unique_ptro escribe el tuyo propio unique_ptr usar Impulsar movimiento.

boost::interprocess::unique_ptr utiliza Boost.Move en su implementación, y Boost.Move emula la semántica de movimiento de C++11 C++03.

contestado el 22 de mayo de 12 a las 17:05

voy a echar un vistazo a boost::interprocess::unique_ptr ahora. Gracias por la ayuda. - bojan komazec

shared_ptr funciona bien para la mayoría de las situaciones (incluida la tuya). Puedes usar este patrón:

shared_ptr<MyT> param = .....;
thread = boost::thread(thread_routine, param);
param.reset();

... y ahora solo thread_routine contiene el objeto.

contestado el 22 de mayo de 12 a las 18:05

Sí, conozco esta solución y, en mi caso, ni siquiera necesito llamar reset as param inmediatamente sale del alcance (esa función regresa tan pronto como se crea el hilo). Pero me preguntaba si Boost tenía algún puntero inteligente sin recuento de referencias que admitiera la semántica de movimiento. Parece que boost::interprocess::unique_ptr es lo que quiero. - bojan komazec

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.