Es seguro de manipular los objetos que he creado fuera de mi hilo si no me explícitamente el acceso a ellos en el hilo que creó a ellos?

StackOverflow https://stackoverflow.com/questions/67154

Pregunta

Estoy trabajando en un cacao de software y en el fin de mantener la interfaz de usuario sensible durante una masiva importación de datos (Datos Básicos) que necesita para ejecutar la importación fuera del hilo principal.

Es seguro el acceso a los objetos, incluso si he creado en el hilo principal, sin el uso de cerraduras si Yo no explícitamente el acceso a los objetos, mientras que el hilo se está ejecutando.

¿Fue útil?

Solución

Con los Datos de los núcleos, usted debe tener un objeto administrado contexto a utilizar para la importación de hilo, conectado a la misma y coordinador de almacén persistente.Usted no puede simplemente tirar los objetos creados en un contexto utilizado por el hilo principal en otro hilo y esperar que funcionen.Además, usted no puede hacer su propio bloqueo para este;usted debe, como mínimo bloquear el objeto administrado contexto de los objetos, según corresponda.Pero si esos objetos son obligados por sus puntos de vista una de controles, no hay "ganchos" que puede agregar que el bloqueo del contexto.

No hay almuerzo gratis.

Ben Trumbull, explica algunas de las razones por las que necesita para utilizar un contexto separado, y por qué "sólo lectura" no es tan simple o tan seguro como usted podría pensar, en este gran post de finales de 2004 en el webobjects-dev lista.(El hilo todo es grande.) Él discutir sobre los Objetos de la Empresa Marco y WebObjects, pero su consejo es plenamente aplicable a los Datos Básicos así.Basta con sustituir "CE" con "NSManagedObjectContext" y "EF" con "Datos Básicos" en la carne de su mensaje.

La solución para el problema del intercambio de datos entre los hilos en los Datos de los núcleos, como los Objetos de la Empresa Marco antes de ella, es "no." Si usted ha pensado en ello y realmente, honestamente, tienen que compartir los datos entre los hilos, entonces la solución es mantener independiente de objetos gráficos en el hilo aislado de los contextos, y el uso de la información en la notificación para guardar de un contexto a decir el otro contexto lo que para volver a recuperar. -[NSManagedObjectContext refreshObject:mergeChanges:] está diseñado específicamente para este uso.

Otros consejos

Creo que este es no seguro que ver con NSManagedObjects (o subclases) que son administrados por un CoreData NSManagedObjectContext.En general, CoreData pueden hacer muchas cosas complicadas con el estado de los objetos administrados, incluyendo el disparo de las fallas relacionadas a los objetos en hilos separados.En particular, [NSManagedObject initWithEntity:insertIntoManagedObjectContext:] (el inicializador designado para NSManagedObjects como de OS X 10.5), no garantiza que el objeto devuelto es seguro pasar a otro hilo.

El uso de CoreData con varios subprocesos está bien documentada en Apple dev sitio.

El punto entero de la utilización de los bloqueos es para asegurarse de que dos hilos no intente acceder a un mismo recurso.Si puede garantizar que a través de algún otro mecanismo, ir a por ello.

Incluso si es seguro, pero no es la mejor práctica para el uso compartido de datos entre los hilos sin sincronizar el acceso a los campos.No importa el hilo que ha creado el objeto, pero si más de una línea de ejecución (subproceso o proceso), es el acceso al objeto, al mismo tiempo, ya que puede conducir a la incoherencia de los datos.

Si usted está absolutamente seguro de que sólo un hilo nunca tener acceso a este objeto, que sería seguro para que no sincronice el acceso.Incluso entonces, prefiero poner la sincronización en mi código de esperar hasta más tarde, cuando un cambio en la aplicación se pone un segundo hilo de compartir los mismos datos, sin la preocupación acerca de la sincronización de acceso.

Sí, es seguro.Un bonito patrón común es crear un objeto, a continuación, añadir a una cola o alguna otra colección.Un segundo "consumidor" subproceso toma los elementos de la cola y hace algo con ellos.Aquí, usted tendría que sincronizar la cola, pero no los objetos que se añaden a la cola.

NO es una buena idea simplemente sincronizar todo y esperar lo mejor.Usted tendrá que pensar muy cuidadosamente acerca de su diseño y exactamente que los threads que pueden actuar sobre los objetos.

Dos cosas a tener en cuenta son:

  • Usted debe ser capaz de garantizar que el objeto es creado e inicializado antes de que se ponga a disposición de otros hilos.
  • Debe haber algún mecanismo por el cual el principal de usuario (GUI) de hilo detecta que los datos se han cargado y todo está bien.Los subprocesos esto implicará inevitablemente bloqueo de algún tipo.

Sí, usted puede hacerlo, será seguro

...hasta la segunda programador llega a su alrededor y no entiende los mismos supuestos que han hecho.La segunda (o 3ª, 4ª, 5ª, ...) programador es probable que empezar a usar el objeto no forma segura (en el creador del hilo).Los problemas causados podría ser muy sutil y difícil de rastrear.Por esa sola razón, y debido a su tan tentador utilizar este objeto en varios hilos, que haría que el objeto de subprocesos.

Para aclarar, (gracias a los que dejaron comentarios):

Por "thread safe" me refiero de manera programática de la elaboración de un plan para evitar problemas de subprocesamiento.Yo no necesariamente significa diseñar un esquema de bloqueo alrededor de su objeto.Usted puede encontrar una manera en que su lengua para hacer que sea ilegal (o muy difícil) para utilizar el objeto en el creador del hilo.Por ejemplo, se limita el ámbito de aplicación, en el creador del hilo, para el bloque de código que crea el objeto.Una vez creado, pase el objeto de que el usuario hilo, asegurándose de que el creador del hilo ya no tiene una referencia a él.

Por ejemplo, en C++

void CreateObject()
{
    Object* sharedObj = new Object();
    PassObjectToUsingThread( sharedObj); // this function would be system dependent
}

A continuación, en su creación hilo, ya no tiene acceso al objeto después de su creación, la responsabilidad se pasa para el uso de hilo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top