zoukankan      html  css  js  c++  java
  • iOS gcd 串行,并行,同步,异步代码研究

    参考文章:

    http://www.cnblogs.com/mddblog/p/4767559.html

    重要结论:

       1)串行队列,同步执行-----串行队列意味着顺序执行,同步执行意味着不开启线程(在当前线程执行)

     

       2)串行队列,异步执行-----串行队列意味着任务顺序执行,异步执行说明要开线程, (如果开多个线程的话,不能保证串行队列顺序执行,所以只开一个线程)

     

       3)并行队列,异步执行-----并行队列意味着执行顺序不确定,异步执行意味着会开启线程,而并行队列又允许不按顺序执行,所以系统为了提高性能会开启多个线程,来队列取任务(队列中任务取出仍然是顺序取出的,只是线程执行无序)。

     

       4)并行队列,同步执行-----同步执行意味着不开线程,则肯定是顺序执行

    分别进行验证

    串行同步

    // 串行同步
    - (void)test_queue_serial_sync
    {
        NSLog(@"串行同步");
        dispatch_queue_t queue = dispatch_queue_create("com.demo.001", DISPATCH_QUEUE_SERIAL);
        NSLog(@"main thread:%p", [NSThread mainThread]);
        dispatch_sync(queue, ^{
            NSLog(@"1 thread: %p", [NSThread currentThread]);
        });
        dispatch_sync(queue, ^{
            NSLog(@"2 thread: %p", [NSThread currentThread]);
        });
        dispatch_sync(queue, ^{
            NSLog(@"3 thread: %p", [NSThread currentThread]);
        });
        dispatch_sync(queue, ^{
            NSLog(@"4 thread: %p", [NSThread currentThread]);
        });
    }
    // 结果
    2017-02-10 18:00:21.991383 RXVerifyExample[4927:2465789] 串行同步
    2017-02-10 18:00:21.991636 RXVerifyExample[4927:2465789] main thread:0x17406cb00
    2017-02-10 18:00:21.992020 RXVerifyExample[4927:2465789] 1 thread: 0x17406cb00
    2017-02-10 18:00:21.992097 RXVerifyExample[4927:2465789] 2 thread: 0x17406cb00
    2017-02-10 18:00:21.992165 RXVerifyExample[4927:2465789] 3 thread: 0x17406cb00
    2017-02-10 18:00:21.992230 RXVerifyExample[4927:2465789] 4 thread: 0x17406cb00
     

    结论:

    串行同步,不创建任何新的线程,因为是在主线程中执行这个方法的,所以,同步方法都在主线程。

    并行同步

    // 并行同步
    - (void)test_queue_concurrent_sync
    {
        NSLog(@"并行同步");
        dispatch_queue_t queue = dispatch_queue_create("com.demo.002", DISPATCH_QUEUE_CONCURRENT);
        NSLog(@"main thread:%p", [NSThread mainThread]);
        dispatch_sync(queue, ^{
            NSLog(@"1 thread: %p", [NSThread currentThread]);
        });
        dispatch_sync(queue, ^{
            NSLog(@"2 thread: %p", [NSThread currentThread]);
        });
        dispatch_sync(queue, ^{
            NSLog(@"3 thread: %p", [NSThread currentThread]);
        });
        dispatch_sync(queue, ^{
            NSLog(@"4 thread: %p", [NSThread currentThread]);
        });
    }
    // 结果:
    2017-02-10 18:04:33.107907 RXVerifyExample[4930:2467403] 并行同步
    2017-02-10 18:04:33.108053 RXVerifyExample[4930:2467403] main thread:0x174066600
    2017-02-10 18:04:33.108121 RXVerifyExample[4930:2467403] 1 thread: 0x174066600
    2017-02-10 18:04:33.108177 RXVerifyExample[4930:2467403] 2 thread: 0x174066600
    2017-02-10 18:04:33.108219 RXVerifyExample[4930:2467403] 3 thread: 0x174066600
    2017-02-10 18:04:33.108259 RXVerifyExample[4930:2467403] 4 thread: 0x174066600
     

    结论:跟串行同步是一样的。

    串行异步1

    // 串行异步1
    - (void)test_queue_serial_async1
    {
        NSLog(@"串行异步方法1");
        dispatch_queue_t queue = dispatch_queue_create("com.demo.0031", DISPATCH_QUEUE_SERIAL);
        NSLog(@"main thread:%p", [NSThread mainThread]);
        dispatch_async(queue, ^{
            NSLog(@"1 thread: %p", [NSThread currentThread]);
        });
        dispatch_async(queue, ^{
            NSLog(@"2 thread: %p", [NSThread currentThread]);
        });
        dispatch_async(queue, ^{
            NSLog(@"3 thread: %p", [NSThread currentThread]);
        });
        dispatch_async(queue, ^{
            NSLog(@"4 thread: %p", [NSThread currentThread]);
        });
    }
    // 结果:
    2017-02-10 18:06:15.124048 RXVerifyExample[4932:2468052] 串行异步方法1
    2017-02-10 18:06:15.124244 RXVerifyExample[4932:2468052] main thread:0x174076a40
    2017-02-10 18:06:15.125490 RXVerifyExample[4932:2468084] 1 thread: 0x174271800
    2017-02-10 18:06:15.125574 RXVerifyExample[4932:2468084] 2 thread: 0x174271800
    2017-02-10 18:06:15.125643 RXVerifyExample[4932:2468084] 3 thread: 0x174271800
    2017-02-10 18:06:15.125710 RXVerifyExample[4932:2468084] 4 thread: 0x174271800

    串行异步2

    // 串行异步2
    - (void)test_queue_serial_async2
    {
        NSLog(@"串行异步方法2");
        dispatch_queue_t queue = dispatch_queue_create("com.demo.0032", DISPATCH_QUEUE_SERIAL);
        NSLog(@"main thread:%p", [NSThread mainThread]);
        dispatch_async(queue, ^{
            NSLog(@"1 thread: %p", [NSThread currentThread]);
        });
        dispatch_async(queue, ^{
            NSLog(@"2 thread: %p", [NSThread currentThread]);
        });
        dispatch_async(queue, ^{
            [NSThread sleepForTimeInterval:4.1];
            NSLog(@"3 thread: %p", [NSThread currentThread]);
        });
        dispatch_async(queue, ^{
            [NSThread sleepForTimeInterval:3.1];
            NSLog(@"4 thread: %p", [NSThread currentThread]);
        });
    }
    // 结果
    2017-02-10 18:08:16.478508 RXVerifyExample[4935:2468827] 串行异步方法2
    2017-02-10 18:08:16.478611 RXVerifyExample[4935:2468827] main thread:0x170072380
    2017-02-10 18:08:16.479034 RXVerifyExample[4935:2468869] 1 thread: 0x174264240
    2017-02-10 18:08:16.479069 RXVerifyExample[4935:2468869] 2 thread: 0x174264240
    2017-02-10 18:08:20.584321 RXVerifyExample[4935:2468869] 3 thread: 0x174264240
    2017-02-10 18:08:23.689611 RXVerifyExample[4935:2468869] 4 thread: 0x174264240

    结论:

    串行异步只创建一个新的线程

    并行异步1

    // 并行异步1
    - (void)test_queue_concurrent_async1
    {
        NSLog(@"并行异步方法1");
        dispatch_queue_t queue = dispatch_queue_create("com.demo.0041", DISPATCH_QUEUE_CONCURRENT);
        NSLog(@"main thread:%p", [NSThread mainThread]);
        dispatch_async(queue, ^{
            NSLog(@"1 thread: %p", [NSThread currentThread]);
        });
        dispatch_async(queue, ^{
            NSLog(@"2 thread: %p", [NSThread currentThread]);
        });
        dispatch_async(queue, ^{
            NSLog(@"3 thread: %p", [NSThread currentThread]);
        });
        dispatch_async(queue, ^{
            NSLog(@"4 thread: %p", [NSThread currentThread]);
        });
    }
    
    // 结果
    2017-02-10 18:09:25.692681 RXVerifyExample[4937:2469287] 并行异步方法1
    2017-02-10 18:09:25.692880 RXVerifyExample[4937:2469287] main thread:0x174073000
    2017-02-10 18:09:25.693828 RXVerifyExample[4937:2469323] 1 thread: 0x174267d00
    2017-02-10 18:09:25.693916 RXVerifyExample[4937:2469323] 2 thread: 0x174267d00
    2017-02-10 18:09:25.693988 RXVerifyExample[4937:2469323] 3 thread: 0x174267d00
    2017-02-10 18:09:25.694056 RXVerifyExample[4937:2469323] 4 thread: 0x174267d00

    并行异步2

    // 并行异步2
    - (void)test_queue_concurrent_async2
    {
        NSLog(@"并行异步方法2");
        dispatch_queue_t queue = dispatch_queue_create("com.demo.0042", DISPATCH_QUEUE_CONCURRENT);
        NSLog(@"main thread:%p", [NSThread mainThread]);
        dispatch_async(queue, ^{
            NSLog(@"1 thread: %p", [NSThread currentThread]);
        });
        dispatch_async(queue, ^{
            NSLog(@"2 thread: %p", [NSThread currentThread]);
        });
        dispatch_async(queue, ^{
            [NSThread sleepForTimeInterval:4.1];
            NSLog(@"3 thread: %p", [NSThread currentThread]);
        });
        dispatch_async(queue, ^{
            [NSThread sleepForTimeInterval:3.1];
            NSLog(@"4 thread: %p", [NSThread currentThread]);
        });
    }
    // 结果
    2017-02-10 18:10:27.262009 RXVerifyExample[4940:2469782] 并行异步方法2
    2017-02-10 18:10:27.262213 RXVerifyExample[4940:2469782] main thread:0x17406e080
    2017-02-10 18:10:27.263710 RXVerifyExample[4940:2469821] 1 thread: 0x174262e80
    2017-02-10 18:10:27.263811 RXVerifyExample[4940:2469821] 2 thread: 0x174262e80
    2017-02-10 18:10:30.369209 RXVerifyExample[4940:2469813] 4 thread: 0x1742648c0
    2017-02-10 18:10:31.369205 RXVerifyExample[4940:2469821] 3 thread: 0x174262e80

    并行异步3

    // 并行异步3
    - (void)test_queue_concurrent_async3
    {
        NSLog(@"并行异步方法3");
        dispatch_queue_t queue = dispatch_queue_create("com.demo.0043", DISPATCH_QUEUE_CONCURRENT);
        NSLog(@"main thread:%p", [NSThread mainThread]);
        dispatch_async(queue, ^{
            [NSThread sleepForTimeInterval:2.1];
            NSLog(@"1 thread: %p", [NSThread currentThread]);
        });
        dispatch_async(queue, ^{
            [NSThread sleepForTimeInterval:1.1];
            NSLog(@"2 thread: %p", [NSThread currentThread]);
        });
        dispatch_async(queue, ^{
            [NSThread sleepForTimeInterval:4.1];
            NSLog(@"3 thread: %p", [NSThread currentThread]);
        });
        dispatch_async(queue, ^{
            [NSThread sleepForTimeInterval:3.1];
            NSLog(@"4 thread: %p", [NSThread currentThread]);
        });
    }
    //结果
    2017-02-10 18:10:59.926988 RXVerifyExample[4942:2470140] 并行异步方法3
    2017-02-10 18:10:59.927184 RXVerifyExample[4942:2470140] main thread:0x17007f8c0
    2017-02-10 18:11:01.033209 RXVerifyExample[4942:2470183] 2 thread: 0x170462ac0
    2017-02-10 18:11:02.033478 RXVerifyExample[4942:2470185] 1 thread: 0x170462f40
    2017-02-10 18:11:03.037799 RXVerifyExample[4942:2470176] 4 thread: 0x170462a40
    2017-02-10 18:11:04.033691 RXVerifyExample[4942:2470177] 3 thread: 0x170462480

    从并行异步的三个例子来看。

    创建的新的线程的数目是不确定的,是跟队列中异步方法个数和异步方法执行的时间有关。

  • 相关阅读:
    参数是指针,传递指针变量,最后函数总分配的内存丢了
    GoDaddy域名注册/空间购买优惠码
    Godaddy主机新建网站说明
    Godaddy主机购买图解教程
    Godaddy 如何添加独立IP到主机账户
    GoDaddy域名注册图解
    Godaddy windows主机添加域名,删除域名,添加子域名 操作说明
    ASP.net与PHP两大网站开发架构优势对比
    Godaddy如何导入导出MSSQL数据库
    什么是DSN文件
  • 原文地址:https://www.cnblogs.com/xzjxylophone/p/6387534.html
Copyright © 2011-2022 走看看