信号量
管理对资源的并发访问,信号量内部有一个可以原子递增或递减的值,如果有一个操作尝试减少信号量的值,使其小于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);
网友评论