2012-03-14 16 views
11

Si tengo un objeto C++ creado en el hilo principal, y luego comienzo otro hilo, y de ese hilo llamo a una función miembro público del objeto que creé, ¿qué ocurre?¿Qué sucede si invoco una función miembro de objetos desde un hilo diferente?

¿Es diferente si la función pública tiene parámetros o si manipula miembros de objetos privados?

¿Tiene un comportamiento diferente en windows, linux o mac os?

¿Qué ocurre si el objeto se crea en la pila?

Respuesta

9

Hay dos puntos que importan:

  • primer lugar, como de costumbre, que necesita para esnure que el tiempo de vida de la instancia es superior a la duración de su uso.
  • En segundo lugar, el acceso a las variables a través de hilos múltiples debe sincronizarse para evitar condiciones de carrera.

Eso es todo amigos.

+0

Si creé el objeto en el montón, ¿hay alguna manera simple de eliminar el objeto cuando sale el último? – neckTwi

3

Si tengo un objeto de C++ creada en el hilo principal, y luego iniciar otro hilo, y desde ese hilo que llamo una función miembro pública del objeto que he creado, lo que pasa?

Depende de la vida útil del objeto.

Si el objeto se crea en heap (memoria dinámica usando new), el otro subproceso accederá a los miembros del objeto correctamente (suponiendo que no existan condiciones de carrera) a menos que el tiempo de vida del objeto termine llamando al delete en el primer subproceso.

Si el objeto se crea en la pila (localmente) en el primer subproceso, tendrá un * Comportamiento no definido * si la duración del objeto creado finalizó antes de accederse en el segundo subproceso.

¿Por qué puede acceder al objeto en la pila en el segundo hilo?

Cada hilo tiene su propia pila ya menos que el objeto creado en la pila de hilo es válida y vivo Usted estaría intentando acceder a una ubicación de dirección, que no apunta a ningún objeto válido en segundo hilo.
Tenga en cuenta que cada proceso tiene un espacio de direcciones y todos los hilos en el mismo proceso comparten el mismo espacio de direcciones, por lo que se puede acceder a la dirección de la variable en el segundo hilo. Sin embargo, debe asegurarse de que la dirección contenga un objeto válido.

¿Es diferente si la función pública tiene parámetros o si manipula miembros de objetos privados?

Especificadores de acceso y subprocesamiento múltiple no están relacionados en absoluto.
Se aplican las mismas reglas de especificador de acceso en todos los hilos.

¿Se comporta de manera diferente en windows, linux o mac os?

La respuesta a #1 está garantizada en todos los sistemas operativos.

+5

Lo siento, eso no es verdad. Si el tiempo de vida del objeto es mayor que el tiempo de vida del hilo, entonces está bien. Pero ten cuidado con las condiciones de carrera. – knivil

+0

@knivil: cierto. Me di cuenta de que echaba de menos decir eso. Editado. –

4
  1. Cada hilo tiene una pila propia y por lo tanto puede tener secuencias de ejecución simultáneas. Es su propio deber hacer que el objeto sea seguro para subprocesos.

  2. No importa. Sin embargo, los miembros privados son candidatos para las condiciones de carrera.

  3. Si crea un objeto en la pila, no será accesible desde otra secuencia.

+8

"Si crea un objeto en la pila, no será accesible desde otra secuencia". A menos que pase una referencia a ese objeto al otro hilo. –

+0

@NicolBolas: Sí, tienes razón, por supuesto. Debería decir "visible". – Matthias

2

En comparación con el comportamiento original no debería haber diferencias si se crea en el montón. Sin embargo, hay algunos culpables, por supuesto, generalmente conocidos bajo el término "seguridad de hilo". Si accede al mismo miembro desde diferentes hilos, debe asegurarse de que el acceso a los mismos recursos no conduzca a una "condición de carrera".

Para evitar condiciones de carrera, puede utilizar diferentes tipos de "bloqueos", por ejemplo, mutexes, etc. Al utilizar el bloqueo de objetos hay otro culpable: el peligro de "bloqueos", si dos accesadores esperan el uno al otro y el original el bloqueo nunca se libera.

2

Funcionará perfectamente. Los objetos no pertenecen a ningún hilo específico y pueden ser llamados igualmente desde cualquier lugar.

Sin embargo, y esto es importante, llamar a la función de miembro en dos hilos al mismo tiempo causará problemas donde actualice algunos datos en un hilo mientras lo lee en otro. Debe organizar su código para asegurarse de que esto no puede suceder o asegurarse de que sus subprocesos coordinen el acceso (utilizando mutex)

2

Lo que sucede es exactamente lo que sucede si lo llama desde el mismo subproceso . Se ejecuta el mismo código de máquina. La única diferencia posible entre es que puede tener varios subprocesos que accedan al objeto al al mismo tiempo; Depende de usted protegerse de esto (al menos si alguno de los de los hilos modifica el objeto — de lo contrario, no es necesaria la protección ).

En el caso de un objeto en la pila, tiene que considerar los problemas de por vida , pero este es el caso de todos modos; guarde un puntero a un objeto en la pila en una variable global, luego deje definido el alcance donde estaba el objeto , y la variable global se convierte en un puntero colgante; intentar acceder al objeto a través del es un comportamiento indefinido (y llamar a una función miembro no estática se considera usarlo). Si el acceso es del mismo hilo o un hilo diferente no cambia nada.

Cuestiones relacionadas