2009-09-01 12 views
5

La compilación Mac de mi aplicación (principalmente POSIX) genera un subproceso secundario que llama a CFRunLoopRun() para hacer un ciclo de evento (para obtener eventos de cambio de configuración de red de MacOS).¿Es seguro llamar a CFRunLoopStop desde otro hilo?

Cuando es hora de empacar y marcharse, el hilo principal llama a CFRunLoopStop() en el ciclo de ejecución del subproceso secundario, en cuyo punto CFRunLoopRun() retorna en el subproceso secundario, el subproceso secundario sale, y el principal subproceso (que estaba bloqueando la espera de que salga el subproceso secundario) puede continuar.

Esto parece funcionar, pero mi pregunta es: ¿es esta una forma segura/recomendada de hacerlo? En particular, ¿está llamando a CFRunLoopStop() desde otro hilo que puede causar una condición de carrera? La documentación de Apple no dice nada sobre el tema, hasta donde yo sé.

Si llamar a CFRunLoopStop() desde el hilo principal no es la solución, ¿cuál es una buena solución? Sé que podría hacer que el hilo hijo llame a CFRunLoopRunInMode() y me despierto cada cierto tiempo para verificar un booleano o algo así, pero preferiría no tener el hilo hijo haciendo ningún sondeo si puedo evitarlo.

Respuesta

2

En particular, ¿está llamando a CFRunLoopStop() desde otro hilo [seguro]?

Esto es lo Run Loop Management dice:

Las funciones de la Fundación Core son generalmente seguros para subprocesos y pueden ser llamadas desde cualquier hilo.

Así que tal vez CFRunLoopStop es seguro. Pero sí me preocupa su uso de la palabra "en general". Mi regla es: si Apple no dice que es seguro, debes asumir que no es seguro.

Para mayor seguridad, podría considerar crear una fuente de ciclo de ejecución, agregarla a su ciclo de ejecución y señalar esa fuente cuando sea el momento de finalizar la secuencia. Ese mismo documento incluye un ejemplo de una fuente de bucle de ejecución personalizada.

11

En el caso de CFRunLoopStop: si solo se pudiera llamar de forma segura en el ciclo de ejecución actual, no sería necesario pasarle un parámetro que indique qué ciclo de ejecución se debe detener.

La presencia del parámetro es una fuerte indicación de que está bien usarlo para detener la ejecución de bucles que no sean el bucle de ejecución actual.

Cuestiones relacionadas