2011-05-06 10 views
6

guía de enhebrado de Apple dice:¿Hay alguna manera de ingresar al modo multiproceso Cocoa sin crear NSThread falso?

Para las aplicaciones multitarea, marcos de cacao utilizar bloqueos y otras formas de sincronización interna para asegurar que se comportan correctamente. Sin embargo, para evitar que estos bloqueos degraden el rendimiento en el caso de subproceso único, Cocoa no los crea hasta que la aplicación genere su primer subproceso nuevo utilizando la clase NSThread. Si genera subprocesos utilizando solo rutinas de subprocesos POSIX, Cocoa no recibe las notificaciones que necesita para saber que su aplicación ahora tiene varios subprocesos. Cuando eso sucede, las operaciones que involucran los marcos de Cocoa pueden desestabilizar o bloquear su aplicación.

Para hacerle saber a Cocoa que tiene la intención de utilizar varios subprocesos, todo lo que tiene que hacer es generar un único subproceso con la clase NSThread y dejar que el subproceso termine inmediatamente. El punto de entrada de tu hilo no necesita hacer nada. Solo el acto de generar un hilo usando NSThread es suficiente para garantizar que los bloqueos necesarios para los marcos Cocoa se pongan en su lugar.

En mi aplicación de iOS, estoy comenzando varios subprocesos desde código C++ desde el principio. Para asegurarse de que la aplicación se comporta correctamente, de acuerdo con el documento anterior, creo un NSThread falso que no hace nada. No me gusta crear un código tan inútil (generalmente es WTF, cuando lo lees por primera vez) y quiero evitar hacerlo. ¿Hay alguna forma mejor de poner mi aplicación en modo multiproceso?

+0

Ayudaría a ver el código donde usted crea el NSThread. ¿Estás llamando "inicio" en el hilo? – pzearfoss

Respuesta

3

Si la hay, no es pública y puede ser inestable.

Si está presionando una WTF en su código, cambie el nombre y vuelva a configurar las cosas para que tenga sentido. Ya que se necesita un objeto ficticio con un selector de maniquí, así, usted podría agregar una clase de usar y tirar como CocoaMultithreading y luego enviar un mensaje +beginMultithreading:

@interface CocoaMultithreading : NSObject 
+ (void)beginMultithreading; 
@end 

int 
main(void) { 
    [CocoaMultithreading beginMultithreading]; 
    /* now do whatever you want */ 
    return EXIT_SUCCESS; 
} 

@implementation CocoaMultithreading 
+ (void)dummyThread:(id)unused 
{ 
    (void)unused; 
} 

+ (void)beginMultithreading 
{ 
    [NSThread detachNewThreadSelector:@selector(dummyThread:) 
      toTarget:self withObject:nil]; 
} 
@end 

Eso debe ser lo suficientemente explícito.

ETA: Alexander Staubø señala que, desde OS X 10.5/IOS 2.0, puede llamar al método -start en una NSThread directamente, por lo que la manera más sencilla de dar la vuelta sobre el Cacao multihilo sería la siguiente:

void XXXActivateCocoaMultithreading(void) { [[NSThread new] start]; } 

Luego, en su función de main:

XXXActivateCocoaMultithreading(); 

Eso es explícita, también, pero ahora le ss desordenado (El XXX está ahí para recordarle que prefija funciones no estáticas. Como las funciones estáticas a menudo se vuelven no estáticas en algún punto, prefijarlas desde el principio es una buena jugada.)

+0

En realidad, parece que esto es suficiente: '[[NSThread new] start];'. Después de esto, '[NSThread isMultiThreaded]' devuelve 'SÍ'. –

+0

@AlexanderStaubo ¡Agradable! '-start' se agregó a' NSThread' en OS X 10.5 y ha estado en iOS desde 2.0, por lo que no te preocupes. Mi única preocupación sería posiblemente explotar el comportamiento indefinido cuando se trata de lo que 'main' hace en un stock' NSThread'. Veo menciones en los documentos 'NSThread' de un' 'principal' predeterminado'", pero no hay una discusión real de lo que hará si no lo ha sobrepasado en una subclase o si ha establecido el destino y el selector. Si alguien está de acuerdo con eso, entonces eso es 100% de la manera más simple, aunque todavía deberían agregar algo para explicar por qué dispararon aleatoriamente un hilo ficticio. –

+0

Parece que NSThread simplemente ignora los selectores que no existen. En ObjC anterior esto emitió una advertencia a stderr, en ObjC 2.0 parece que está en silencio. (Realmente deseo que Xcode venga con las fuentes del framework principal. Intentar desarmar la librería de Foundation no me llevó a nada rápido). –

Cuestiones relacionadas