2010-07-27 10 views
6

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

10

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.

+0

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. –

+0

+1 para usar un mutex para notificación –

+0

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

0

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.

Cuestiones relacionadas