Estoy leyendo http://gcc.gnu.org/onlinedocs/libstdc++/manual/shared_ptr.html y algunos problemas de seguridad de los subprocesos aún no están claros para mí:
- Standard garantiza que el recuento de referencias se maneja con seguridad para subprocesos y es independiente de la plataforma, ¿verdad?
- Problema similar: el estándar garantiza que solo un hilo (con la última referencia) llamará a eliminar en el objeto compartido, ¿verdad?
- shared_ptr no garantiza ningún hilo de seguridad para el objeto almacenado en él?
EDITAR:
Pseudo código:
// Thread I
shared_ptr<A> a (new A (1));
// Thread II
shared_ptr<A> b (a);
// Thread III
shared_ptr<A> c (a);
// Thread IV
shared_ptr<A> d (a);
d.reset (new A (10));
¿Llamar a reset () en el hilo IV eliminará la instancia anterior de una clase creada en el primer hilo y la reemplazará con una nueva instancia? Además, después de llamar a reset () en el hilo IV, ¿otros hilos verán solo el objeto recién creado?
c++
c++11
shared-ptr
Mentecato
fuente
fuente

make_sharedlugar denewRespuestas:
Como han señalado otros, lo ha resuelto correctamente con respecto a sus 3 preguntas originales.
Pero la parte final de tu edición
Es incorrecto. Sólo
dse apunte a la nuevaA(10), ya,byccontinuará hasta el punto de que el originalA(1). Esto se puede ver claramente en el siguiente breve ejemplo.(Claramente, no me molesté con ningún hilo: eso no influye en el
shared_ptr::reset()comportamiento).La salida de este código es
fuente
Los correctos
shared_ptrutilizan incrementos / decrementos atómicos de un valor de recuento de referencia.El estándar garantiza que solo un hilo llamará al operador de eliminación en un objeto compartido. No estoy seguro de si especifica específicamente que el último hilo que elimina su copia del puntero compartido será el que llame a eliminar (probablemente, en la práctica, este sería el caso).
No, no es así, el objeto almacenado en él puede ser editado simultáneamente por varios hilos.
EDITAR: Seguimiento leve, si desea tener una idea de cómo funcionan los punteros compartidos en general, es posible que desee consultar la
boost::shared_ptrfuente: http://www.boost.org/doc/libs/1_37_0/boost/shared_ptr.hpp .fuente
std::shared_ptrno es seguro para subprocesos.Un puntero compartido es un par de dos punteros, uno al objeto y otro a un bloque de control (manteniendo el contador de referencia, enlaces a punteros débiles ...).
Puede haber múltiples std :: shared_ptr y cada vez que acceden al bloque de control para cambiar el contador de referencia, es seguro para subprocesos, pero el
std::shared_ptrmismo NO es seguro para subprocesos ni atómico.Si asigna un nuevo objeto a un
std::shared_ptrtiempo que otro hilo lo usa, podría terminar con el puntero del nuevo objeto pero aún usando un puntero al bloque de control del objeto antiguo => CRASH.fuente
std::shared_ptrinstancia no es segura para subprocesos. Desde std :: shared_ptr reference:If multiple threads of execution access the same shared_ptr without synchronization and any of those accesses uses a non-const member function of shared_ptr then a data race will occur;std::shared_ptr<T>garantiza que una instancia es segura para subprocesos cuando siempre se usa por valor (copiado / movido) a través de los límites del subproceso. Todos los demás usosstd::shared_ptr<T>&no son seguros a través de los límites de los hilos