美文网首页
2018-03-29线程同步的一些记录

2018-03-29线程同步的一些记录

作者: 强哥1号拖拉机1 | 来源:发表于2018-03-29 16:16 被阅读0次

1,两个异步执行完了,才继续执行,柱塞了主线程

NSLog(@"currentThread---%@",[NSThread currentThread]); // 打印当前线程

    NSLog(@"semaphore---begin");

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

    dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);

    __block int number = 0;

    dispatch_async(queue, ^{

        // 追加任务1

        NSLog(@"1---%@",[NSThread currentThread]);      // 打印当前线程

        [NSThread sleepForTimeInterval:2];              // 模拟耗时操作

        NSLog(@"11---%@",[NSThread currentThread]);      // 打印当前线程

        number = 100;

        dispatch_semaphore_signal(semaphore);

    });

    dispatch_async(queue, ^{

        // 追加任务1

        NSLog(@"2---%@",[NSThread currentThread]);      // 打印当前线程

        [NSThread sleepForTimeInterval:1];              // 模拟耗时操作

        NSLog(@"22---%@",[NSThread currentThread]);      // 打印当前线程

        number = 100;

        dispatch_semaphore_signal(semaphore);

    });

    NSLog(@"3");

    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);

    NSLog(@"4");

    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);

    NSLog(@"semaphore---end,number = %zd",number);

2,三个异步执行完了,才继续执行,不柱塞主线程

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

    dispatch_group_t group = dispatch_group_create();

    dispatch_group_async(group, queue, ^{ /*加载图片1 */

        NSLog(@"1开始");

        [NSThread sleepForTimeInterval:3];

        NSLog(@"1完成%@",[NSThread currentThread]);

    });

    dispatch_group_async(group, queue, ^{ /*加载图片2 */

        NSLog(@"2开始");

        [NSThread sleepForTimeInterval:1];

        NSLog(@"2完成%@",[NSThread currentThread]);

    });

    dispatch_group_async(group, queue, ^{ /*加载图片3 */

        NSLog(@"3开始");

        [NSThread sleepForTimeInterval:2];

        NSLog(@"3完成%@",[NSThread currentThread]);

    });

    dispatch_group_notify(group, dispatch_get_main_queue(), ^{

        // 合并图片… …这里就可以等待了

        NSLog(@"完成%@",[NSThread currentThread]);

    });

    NSLog(@"主线程做其他事");

-----------------------------------------------

3,三个异步执行完了,才继续执行,柱塞主线程

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

    dispatch_group_t group = dispatch_group_create();

    dispatch_group_async(group, queue, ^{ /*加载图片1 */

        NSLog(@"1开始");

        [NSThread sleepForTimeInterval:3];

        NSLog(@"1完成%@",[NSThread currentThread]);

    });

    dispatch_group_async(group, queue, ^{ /*加载图片2 */

        NSLog(@"2开始");

        [NSThread sleepForTimeInterval:1];

        NSLog(@"2完成%@",[NSThread currentThread]);

    });

    dispatch_group_async(group, queue, ^{ /*加载图片3 */

        NSLog(@"3开始");

        [NSThread sleepForTimeInterval:2];

        NSLog(@"3完成%@",[NSThread currentThread]);

    });

    NSLog(@"等待啊");

    dispatch_group_wait(group, DISPATCH_TIME_FOREVER);

    NSLog(@"主线程做其他事");

----------------------------------------

4,添加barrier障碍操作,会等待前面的并发操作结束,并暂时阻塞后面的并发操作直到其完成,不柱塞主线程

    /* 创建并发队列 */

    dispatch_queue_t concurrentQueue = dispatch_queue_create("test.concurrent.queue", DISPATCH_QUEUE_CONCURRENT);

    /* 添加两个并发操作A和B,即A和B会并发执行 */

    dispatch_async(concurrentQueue, ^(){

        NSLog(@"OperationA%@",[NSThread currentThread]);

        NSLog(@"OperationA完成%@",[NSThread currentThread]);

    });

    dispatch_async(concurrentQueue, ^(){

        NSLog(@"OperationB%@",[NSThread currentThread]);

        [NSThread sleepForTimeInterval:2];

        NSLog(@"OperationB完成%@",[NSThread currentThread]);

    });

    /* 添加barrier障碍操作,会等待前面的并发操作结束,并暂时阻塞后面的并发操作直到其完成 */

    dispatch_barrier_async(concurrentQueue, ^(){

        NSLog(@"OperationBarrier!");

    });

    /* 继续添加并发操作C和D,要等待barrier障碍操作结束才能开始 */

    dispatch_async(concurrentQueue, ^(){

        NSLog(@"OperationC");

    });

    dispatch_async(concurrentQueue, ^(){

        NSLog(@"OperationD");

    });

    NSLog(@"主线程做其他事");

-------------------------------------------------------

    5,使用信号量实现任务2依赖于任务1,即任务2要等待任务1结束才开始执行:

    /* 创建一个信号量 */

    dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);

    /* 任务1 */

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        /* 耗时任务1 */

        NSLog(@"任务1开始");

        [NSThread sleepForTimeInterval:3];

        NSLog(@"任务1结束");

        /* 任务1结束,发送信号告诉任务2可以开始了 */

        dispatch_semaphore_signal(semaphore);

    });

    /* 任务2 */

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        /* 等待任务1结束获得信号量, 无限等待 */

        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);

        /* 如果获得信号量则开始任务2 */

        NSLog(@"任务2开始");

        [NSThread sleepForTimeInterval:3];

        NSLog(@"任务2结束");

    });

    NSLog(@"主线程做其他事");

----------------------------------------------------------

6,模拟1000个等待执行的任务,通过信号量控制最大并发任务数量为5 

    /* 创建一个信号量并初始化为5 */

    dispatch_semaphore_t semaphore = dispatch_semaphore_create(5);

    /* 模拟1000个等待执行的任务,通过信号量控制最大并发任务数量为5 */

    for (int i = 0; i < 1000; i++) {

        /* 任务i */

        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

            /* 耗时任务1,执行前等待信号使信号量减1 */

            dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);

            NSLog(@"任务%d开始", i);

            [NSThread sleepForTimeInterval:2];

            NSLog(@"任务%d结束", i);

            /* 任务i结束,发送信号释放一个资源 */

            dispatch_semaphore_signal(semaphore);

        });

    }

    NSLog(@"主线程做其他事");

相关文章

  • 2018-03-29线程同步的一些记录

    1,两个异步执行完了,才继续执行,柱塞了主线程 NSLog(@"currentThread---%@",[NSTh...

  • OpenMP多线程——Parallel for

    多线程——线程同步 数据竞争问题 线程互斥同步——critical 线程互斥同步——atmoic 线程互斥同步——...

  • python3线程同步,Lock、Rlock、Condition

    线程同步 Lock、Rlock锁机制 使用锁的原因 为了避免线程间进行数据竞争,有时必须使用一些机制来强制线程同步...

  • OC dispatch_sync和dispatch_async

    今天突然发现同步异步和我想的不太一样,特地记录一下。 在主线程执行: 在子线程执行: 总结: 在当前线程中执行同步...

  • iOS开发之GCD多线程一

    1. 多线程的一些相关概念 1.1 进程和线程:操作系统学习笔记之进程与线程 1.2 同步和异步 同步任务:在执行...

  • 线程池和多线程同步的一些问题

    关于线程池和多线程同步的一点问题记录 1.线程池 newScheduledThreadPool可以设定预定工作时间...

  • iOS线程同步

    iOS线程同步 iOS线程同步

  • 线程的基本语法

    线程同步[解决线程安全问题] 解决线程安全问题 线程同步方式一:同步代码 语法基本 synchronized (同...

  • GCD多线程同步实现锁效果

    多线程同步?这个有什么意义呢。多线程编程里面,一些敏感数据不允许被多个线程同时访问,此时就使用同步访问技术,保证数...

  • iOS多线程小结

    同步异步串行并行 同步串行:不开启线程 同步并行:不开启线程 异步串行:最多开启一个线程 异步并行:开启线程 同步...

网友评论

      本文标题:2018-03-29线程同步的一些记录

      本文链接:https://www.haomeiwen.com/subject/rpamcftx.html