A preguntas de la prueba GCD pluma

dispatch_queue_t queue = dispatch_queue_create("com.ihunyu.test", DISPATCH_QUEUE_CONCURRENT);
    NSLog(@"1");
    dispatch_async(queue, ^{
        NSLog(@"2");
        dispatch_async(queue, ^{
            NSLog(@"3");
        });
        NSLog(@"4");
    });
    NSLog(@"5");

Salida: 15 243
Análisis: Después de imprimir el 1, cola de ejecución en paralelo asíncrono, se crea un nuevo hilo, pero esto va a llevar mucho tiempo, por lo que la primera impresión 5, 2 y luego imprimir la misma razón, también hay creación de un nuevo dispatch_async hilo, pero requieren mucho tiempo, por lo que la primera impresión después de la impresión 4 3. Donde (1,5) en la impresión hilo principal, (2,4) para imprimir un nuevo hilo en el recién abierto, (3) ha abierto una nueva impresión en otro hilo.

dispatch_queue_t queue = dispatch_queue_create("com.ihunyu.test", DISPATCH_QUEUE_CONCURRENT);
    NSLog(@"1");
    dispatch_async(queue, ^{
        NSLog(@"2");
        dispatch_sync(queue, ^{
            NSLog(@"3");
        });
        NSLog(@"4");
    });
    NSLog(@"5");

Salida: 15 234
Análisis: igual que el primer ejemplo, imprime 152, en el interior dispatch_sync cola de ejecución síncrona concurrente, el nuevo hilo no se puede abrir, solamente ejecución en serie, y similares necesidad de realizar después de que el bloque más interno después, es decir, imprimir 3, continuará para imprimir 4. Donde (1,5) en la impresión hilo principal, (2,3,4) para imprimir un nuevo hilo en que recién abierto.

dispatch_queue_t queue = dispatch_queue_create("com.ihunyu.test", DISPATCH_QUEUE_SERIAL);
    NSLog(@"1");
    dispatch_async(queue, ^{
        NSLog(@"2");
        dispatch_sync(queue, ^{
            NSLog(@"3");
        });
        NSLog(@"4");
    });
    NSLog(@"5");

Salida: 1 2 5 accidente
Análisis: Primera impresión 1, entonces la cola de ejecución asíncrona en serie, para crear un nuevo hilo, ejecución en serie. Pero consume mucho tiempo, así que la primera impresión 5, y luego imprimir 2. A continuación, la cola de ejecución síncrona en serie, no se puede crear un nuevo hilo en el bloque de capa exterior a la espera de la ejecución del bloque se llevará a cabo, tal como la capa interior del bloque exterior ejecutar el bloque será implementado, resultando en un punto muerto.

Publicados 103 artículos originales · ganado elogios 55 · vistas 380 000 +

Supongo que te gusta

Origin blog.csdn.net/dolacmeng/article/details/89516854
Recomendado
Clasificación