2012-07-24 19 views
5

He estado pensando en escribir una clase de contenedor para controlar el acceso a una estructura de datos compleja que tendrá uso en un entorno de subprocesos múltiples.constructores C++ y concurrencia

Y entonces la pregunta se me ocurrió:

¿Hay alguna situación en la que los constructores C++ deben ser flujos seguros?

Respuesta

2

No en mi experiencia. Es el código que llama al constructor, implícitamente o de otro modo, que necesita hacerse seguro para subprocesos si la aplicación lo requiere.

La razón es que solo un hilo debe inicializar un objeto a la vez, por lo que no es necesaria la sincronización para proteger el objeto que se inicializa dentro del propio constructor (si el objeto no ha finalizado la inicialización, no debería compartido entre hilos de todos modos).

Otra forma de verlo es esta: los objetos se deben tratar como lógicamente inexistentes hasta que sus constructores hayan regresado. Entonces, un hilo que está en el proceso de crear un objeto es el único hilo que "sabe" sobre él.

Por supuesto, se aplican las reglas de sincronización adecuados a cualquier recurso compartido el constructor accesos, sino que se aplica a cualquier función (que he encontrado personas que no se dan cuenta de esto, los constructores que creen son especiales y de alguna manera proporcionan acceso exclusivo a todos los recursos).

+0

Esto no es del todo cierto. Hay problemas de seguridad de subprocesos para el constructor cuando utiliza un patrón de diseño singleton. Y ahora estoy buscando una solución para esta situación. – PDuarte

3

Ciertamente puede invocar el mismo constructor de más de un hilo a la vez. Es ese sentido, deben ser seguros para hilos, al igual que cualquier otra función debe ser. Si el constructor va a modificar el estado compartido, por ejemplo, su contenedor, entonces debe usar la sincronización para asegurarse de que el estado se modifique de manera determinista.

No puede construir el mismo objeto en más de un hilo a la vez, porque cada objeto solo se construye una vez, por lo que no hay forma de invocar el constructor en el mismo objeto más de una vez, y mucho menos en dos subprocesos diferentes al mismo tiempo.

+0

En C++, el objeto existe técnicamente hasta que el constructor finaliza, por lo que si el contructor no tiene efectos secundarios fuera del objeto, ¿pueden acceder a él otros subprocesos? – ThomasMcLeod

+1

Pero hay formas en que podrías terminar intentando construir dos objetos diferentes en el mismo espacio al mismo tiempo ... me viene a la mente una nueva ubicación. Si bien es posible que no estés haciendo esto tú mismo. Esto también podría suceder si estás presionando las entradas hacia atrás en un vector. Esto no puede suceder si tiene una sincronización que proteja la ubicación de la memoria de los objetos que se crearán, en este ejemplo, un bloqueo en el vector. –

+0

@MichaelAnderson, no estoy siguiendo el ejemplo de tu vector. – ThomasMcLeod

4

En general, no se puede llamar a un constructor para el mismo objeto por dos subprocesos simultáneamente. Sin embargo, el mismo constructor ciertamente se puede llamar para diferentes objetos al mismo tiempo.

+0

No es cierto para patrones de singleton. – PDuarte

+0

@PDuarte con singleton, todavía hay un solo constructor llamado una vez. –