En un programa C++, tengo dos objetos contados de referencia: King y Heir. Heredero necesita bloquear hasta que King sea destruido. King es un objeto contado de referencia que se destruirá cuando su recuento de referencias pase a cero. Si Heredero tiene una referencia al Rey, entonces el recuento de referencia del Rey nunca irá a cero. ¿Cómo puede Heir bloquear hasta que King sea destruido?notificación de terminación de objeto C++
Respuesta
Puede utilizar una referencia no propietaria (o "débil"), similar a how weak_ptr
works.
En cuanto a esperar hasta que el rey muera, puedes usar un mutex que el rey puede retener hasta que muera y tener el heredero esperando que el rey lo suelte.
Si necesita tener varios herederos esperando y hay algún pedido a los herederos, puede tener un objeto "selector de heredero" que realiza un seguimiento de la lista de herederos y su orden de precedencia, y cuando el rey libera el Sin embargo, asignará la propiedad de ese mutex al próximo heredero de la lista.
Gracias @James. Esta es la solución con la que terminé:
El método mutex parecía prometedor, pero la mayoría de los mutex esperan que el hilo de adquisición y el de liberación sean los mismos. Al final, hice que Heir creara un semáforo con un conteo de cero en la pila, pasara un puntero al semáforo a King, liberara King y luego intentara adquirir el semáforo. El recuento es cero, por lo que Heredero bloquea inmediatamente. Cuando se llama al destructor de King, se llama 'liberación' en el semáforo. Esto parece funcionar bien con el semáforo Rogue Wave.
- 1. Recibir notificación sobre una terminación de proceso Java
- 2. C# - Aplicación de terminación terminada()
- 3. C# Terminación de subproceso y Thread.Abort()
- 4. C#: ¿Notificación antes de recopilar WeakReference?
- 5. Cómo cancelar la notificación en la terminación de aplicación inesperada/forzada
- 6. detectar la terminación del programa (C, Windows)
- 7. Condiciones de terminación de bucle
- 8. Terminación de un programa de Python
- 9. Terminación de la inducción estructural
- 10. Recuperar datos de notificación de notificación
- 11. Android Beep o Light sin un objeto de notificación?
- 12. Ejemplo de notificación personalizada de cacao
- 13. supervisorctl ERROR (terminación anómala)
- 14. Cola de prioridad de doble terminación
- 15. confusión de la clave del puerto de terminación IO
- 16. C++ copy std :: string a char array sin terminación nula
- 17. Will std :: string siempre tendrá terminación nula en C++ 11?
- 18. Fuentes comunes de cadena literal sin terminación
- 19. java hilo de terminación temprana y sospechosamente
- 20. terminación de línea con comandos personalizados
- 21. Terminación de un proceso antivirus protegido
- 22. ¿Cómo deshabilitar la molesta 'terminación de paréntesis'?
- 23. C# ASP.NET Reconocimiento de notificación de Google Checkout
- 24. Notificación de destrucción de objetos en Ruby
- 25. Notificación sobre los cambios del objeto blob azul
- 26. ¿Dónde y cómo registro un objeto para recibir una Notificación?
- 27. datos de salir del bloque de terminación NSURLResponse
- 28. ¿Cómo implemento la terminación elegante en Java?
- 29. Vista de notificación personalizada
- 30. Android Icono de notificación
Bah ... respondimos lo mismo y usted agregó un poco más en la parte de espera. Suprimió la mía y subió la tuya. Solo para agregar, el Heredero debe mantener la referencia de weak_ptr al Rey. –
+1 para usar un mutex para notificación –
El weak_ptr no funcionará, al menos no sin sondeo. Para ejecutar un método de bloqueo en King, debes eliminar la referencia de weak-ptr. Cuando esto sucede, obtienes una fuerte referencia al objeto y lo mantienes hasta que esté dentro del alcance. – brianegge