美文网首页
16.GCD高级用法

16.GCD高级用法

作者: LucXion | 来源:发表于2021-12-27 18:26 被阅读0次

    信号量

    • 管理对资源的并发访问,信号量内部有一个可以原子递增或递减的值,如果有一个操作尝试减少信号量的值,使其小于0,那么这个动作将会被阻塞,直到有其他调用者(在其他线程中)增加该信号量的值。

    • 信号量不依赖调度队列,可以直接在任何线程中使用。

    • 信号量属于底层工具,从设计的角度出发,应该优先考虑使用诸如操作队列这样的高级工具。通常可以通过增加一个分派队列配合dispatch_suspend。信号量本身是锁,能不用就不用,在把异步任务转换为同步任务时,信号量是最合适的工具。

    dispatch_semaphore_create;
    dispatch_semaphore_wait;
    dispatch_semaphore_signal;
    

    分派源

    分派源提供了高效的方式来处理事件。首先注册事件处理程序,事件发生时会发送通知,如果在系统还没来得及通知你之前事件就发生了很多次,那么这些事件会被合并成一个事件,这对于底层的高性能代码很有用。分派源可以响应UNIX信号、文件系统的变化、其他进程的变化、Mach Port事件。

    自定义源可以累积事件中传递过来的值,累积的方式有DISPATCH_SOURCE_TYPE_DATA_ADD(相加)、DISPATCH_SOURCE_TYPE_DATA_OR(逻辑或)。

    同一时间里,只有一个处理方法块的实例被分派。如果这个处理方法还没有执行完,另一个事件就发生了,那么事件会以指定的方式进行累积(ADD/OR)。通过合并事件的方式,系统即使在高负载情况下也能正常工作。当处理事件最终被执行时,计算后的数据可以通过dispatch_source_get_data来获取。

    // 创建源
    dispatch_source_t
      source = dispatch_source_create(DISPATCH_SOURCE_TYPE_DATA_ADD,
                                      0, 0, dispatch_get_main_queue());
    // 分派处理方法
    dispatch_source_set_event_handler(source, ^{
        long value = dispatch_source_get_data(source);
      });
    // 分派源创建时默认处于暂停,分派处理程序之前必须先恢复
    dispatch_resume(source);
    // 向分派源发送事件
    dispatch_source_merge_data(source, 1);
    

    相关文章

      网友评论

          本文标题:16.GCD高级用法

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