Tenga en cuenta que el bloqueo es muy costoso y ocurre cada vez que entrega objetos entre punteros inteligentes, incluso cuando el objeto pertenece actualmente a un hilo (la biblioteca del puntero inteligente no lo sabe).
Teniendo en cuenta esto, puede haber una regla general aplicable en este caso (estoy feliz de ser corregido!)
Si las cosas del siguiente aplique en su caso:
- Usted tiene estructuras de datos complejas que sería difícil escribir destructores para (o donde la semántica del valor de estilo STL sería inapropiada, por diseño) por lo que necesita punteros inteligentes para hacerlo por usted, y
- Está usando múltiples hilos que comparten estos objetos, y
- Le importa por el rendimiento y la corrección
... entonces la recolección de basura real puede ser una mejor opción. A pesar de que GC tiene una mala reputación por el rendimiento, todo es relativo. Creo que se compara muy favorablemente con el bloqueo de punteros inteligentes. Fue una parte importante de por qué el equipo de CLR eligió el verdadero GC en lugar de algo usando el recuento de referencias. Ver this article, en particular, esta cruda comparación de lo que significa la asignación de referencia si ha contando pasando:
sin ref-conteo:
a = b;
ref conteo:
if (a != null)
if (InterlockedDecrement(ref a.m_ref) == 0)
a.FinalRelease();
if (b != null)
InterlockedIncrement(ref b.m_ref);
a = b;
también tenga en cuenta que el Informe técnico 1 (TR1) es un borrador de artículos para su inclusión en el estándar C++ 0x. A medida que C++ 0x se acerca, estos también serán mejor respaldados (se basan en la biblioteca de Boost). –
Tengo mis dudas sobre la implementación sin bloqueo, pero esta es probablemente la mejor opción. Multi-Thread es terriblemente difícil de hacer en C++ con todos los trucos que el compilador puede hacerle a su código. –
Hombre ... O me estoy perdiendo algo, o algo está mal con esta respuesta ... ¿Por qué fue aceptado y votado tantas veces, si ni siquiera responde la pregunta original? Simplemente sugiere algo ¿más que ya tiene una implementación funcional de lo mismo que estaba en OQ? – Paulius