Pregunta

Digamos que tengo un contenedor (std::vector de punteros utilizados por una aplicación multiproceso.Cuando la adición de nuevos punteros en el contenedor, el código está protegida con una sección crítica (boost::mutex).Todo bien y bueno.El código debe ser capaz de volver a uno de estos punteros a un hilo de procesamiento, pero en otro hilo se podría optar por eliminar uno de estos punteros, que podría estar todavía en uso.por ejemplo:

thread1()
{
    foo* p = get_pointer();
    ...
    p->do_something();
}

thread2()
{
    foo* p = get_pointer();
    ...
    delete p;
}

Así thread2 podría eliminar el puntero mientras thread1 que la está utilizando.Desagradable.

Así que en lugar quiero usar un contenedor de Impulso compartido un rap.IIRC estos punteros se cuentan las referencias, así que mientras yo regreso compartido un rap en lugar de raw punteros, la eliminación de uno de los contenedores en realidad NO gratuito hasta el último uso de ella sale del ámbito.es decir,

std::vector<boost::shared_ptr<foo> > my_vec;

thread1()
{
    boost::shared_ptr<foo> sp = get_ptr[0];
    ...
    sp->do_something();
}

thread2()
{
    boost::shared_ptr<foo> sp = get_ptr[0];
    ...
    my_vec.erase(my_vec.begin());
}

boost::shared_ptr<foo> get_ptr(int index)
{
    lock_my_vec();
    return my_vec[index];
}

En el ejemplo anterior, si thread1 obtiene el puntero antes de thread2 llamadas borrar, se señala el objeto sigue siendo válido?Que en realidad no se borran cuando thread1 completa? Tenga en cuenta que el acceso a la global vector será a través de una sección crítica.

Yo creo que esto es como shared_ptrs trabajo, pero necesito estar seguro.

¿Fue útil?

Solución

Para el roscado de seguridad de boost::shared_ptr usted debe comprobar en este enlace.No es garantizada para estar seguro, pero en muchas plataformas funciona.La modificación de la std::vector no es seguro AFAIK.

Otros consejos

En el ejemplo anterior, si thread1 obtiene el puntero antes de thread2 llamadas borrar, se señala el objeto sigue siendo válido?Que en realidad no se borran cuando thread1 completa?

En tu ejemplo, si thread1 obtiene el puntero antes de thread2, entonces thread2 tendrá que esperar al comienzo de la función (a causa de la cerradura).Así que, sí, señala el objeto sigue siendo válido.Sin embargo, es posible que desee asegurarse de que my_vec no está vacía antes de acceder a su primer elemento.

Si, además, se puede sincronizar los accesos a los vectores (como en el raw original, puntero de la propuesta), su uso es seguro.De lo contrario, puede caer mal de ejemplo 4 en el enlace proporcionado por el otro demandado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top