Red de conocimiento informático - Problemas con los teléfonos móviles - implementación de shared_ptr y análisis de seguridad de subprocesos

implementación de shared_ptr y análisis de seguridad de subprocesos

Para usar este puntero inteligente (o cualquiera de los otros dos punteros), necesita importar el archivo de encabezado #include lt;memorygt

De lo contrario, puede asignar un valor a shared_ptr, que se puede lograr anulando operator=. Tenga en cuenta que para p1 = p2 (ambos punteros inteligentes), el recuento de referencias del objeto señalado por p2 aumenta en uno porque está señalado por p1, y el recuento de referencias del recurso originalmente señalado por p1 disminuye en uno. . Esto también provoca los siguientes problemas de seguridad de subprocesos con punteros _ptr compartidos.

Los resultados son los siguientes:

Todavía hay algunos problemas con la implementación aquí, porque el recuento de referencias en el código fuente deshared_ptr es atómico y no es necesario considerar conflictos. usos de los recursos, pero puede bloquearlo cuando lo implemente usted mismo.

En primer lugar, ¿qué es la seguridad de subprocesos?

En pocas palabras, varios subprocesos que operan en un único bloque de datos disfrutado se comportarán como se espera, independientemente del orden de entrelazado en el que se ejecutan los subprocesos.

Parashared_ptr, hay dos variables internamente: un recuento de referencia y un puntero al tipo de objeto real. Una de las variables (el recuento de referencias) es una operación atómica, por lo que leer share_ptr es seguro para subprocesos.

Pero para la asignación en share_ptr (por ejemplo, ptr1 = ptr2), se requieren dos pasos: 1. el puntero de objeto interno Obj1 de ptr1 será reemplazado por el puntero de objeto interno Obj2 de ptr2 y 2.ptr1 empareja Obj1; El recuento de referencias se almacenará en caché en el recuento de referencias de Obj2.

Estos dos pasos no son atómicos. Si un subproceso necesita asignar una operación _ptr compartida ptr1 = ptr2, y justo después del primer paso, el subproceso cambia a otro subproceso y luego ejecuta ptr2 Operaciones como ptr2 = ptr3, lo que puede provocar que se reconstruya el recuento de referencia. Continuar con el segundo paso del hilo anterior generará un error.

En resumen: las lecturas deshared_ptr son seguras para subprocesos.

Las operaciones de lectura y escritura enshared_ptr no son seguras para subprocesos y requieren bloqueo.

Consejo: ¿Por qué se sincroniza el recuento de referencias de share_ptr entre punteros?

Algunas personas respondieron que es posible que haya utilizado variables estáticas, lo cual no es posible porque solo hay una variable estática en una clase y solo puede rastrear el número de referencias a un solo objeto, lo cual no es posible cuando hay más de dos programas share_ptr no es factible.

Personalmente no creo que sea una buena idea, pero creo que usarshared_ptr es una buena idea.

Personalmente, creo que el recuento de referencias se puede implementar mediante un puntero al objeto que puede rastrear el número de referencias.