b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

semaphoreGCD 中那些你可能不熟悉的知识

电脑杂谈  发布时间:2018-02-17 23:10:57  来源:网络整理

semaphore_semaphore c语言_semaphore java用法

dispatch_get_global_queue 用来从 GCD 的全局队列池中获取一个全局的队列。

全局队列都是并发队列。

第一个参数在 iOS 7 及更低版本上表示优先级,有四种取值,定义如下:

在 iOS 8 及更高版本上表示服务质量(QoS),有六种取值,定义如下:

DISPATCH_QUEUE_PRIORITY_HIGH 和 QOS_CLASS_USER_INTERACTIVE 都是最高的优先级。

DISPATCH_QUEUE_PRIORITY_BACKGROUND 和 QOS_CLASS_BACKGROUND 的优先级非常低,一般不用,因为使用此优先级的任务很难被调度到。

如果需要兼容 iOS 7 和 iOS 8,可以往第一个参数中传入 0,在 iOS 7 中 0 是 DISPATCH_QUEUE_PRIORITY_DEFAULT 的取值,在 iOS 8 中,0 是 QOS_CLASS_UNSPECIFIED 的取值,所以都不会有问题。

第二个参数是苹果设计用来给未来做扩展用的,目前没有任何作用,开发中都是传入 0 即可。

dispatch_queue_create 用来自己创建一个串行队列或并发队列。

第一个参数是队列名称,队列名称可以用来在 debug 或性能调优时在调用栈中显示队列名称,或者在 crash 日志中显示当前队列名,来帮助定位问题。通过查看系统创建的队列的命名方式,会发现苹果一般是用 反域名风格来命名队列的。

第二个参数应该不陌生,就是传入 DISPATCH_QUEUE_SERIAL 来创建串行队列,传入 DISPATCH_QUEUE_CONCURRENT 来创建并发队列,也可以传入 NULL 这时也代表创建串行队列。

可以通过 dispatch_set_context 和 dispatch_get_context 来保存和获取自定义的上下文信息。dispatch_set_context 的参数是 void * 类型,可以传入任何 Objective-C 对象或者其它 C 指针类型等。

队列的 Finalizer Function 会在队列销毁前调用,用 dispatch_set_finalizer_f 函数来给队列设置 Finalizer Function。

函数区别

1. 会从线程池拿新线程并在新线程上执行任务。

2. 函数本身会立刻返回,继续执行后续代码。

1. 不会拿新线程,在当前线程上执行任务。

semaphore c语言_semaphore java用法_semaphore

2. 函数本身会阻塞其它代码在当前线程上的执行,等到 Block 执行完成后,函数才会返回,继续执行后续代码。

对于串行队列,dispatch_sync 的调用方所在队列如果和 dispatch_sync 的第一个参数是同一个队列,就会造成死锁。

上面代码会发生死锁,同样的,在主队列中 dispatch_sync 也会死锁:

dispatch_suspend 挂起指定的队列,这时队列中的 task 会停止执行。

dispatch_resume 恢复被挂起的指定队列,让队列中的任务继续执行。

这两个函数对应执行的或者正在执行的处理没有影响,只对追加到 Dispatch Queue 中但是尚未执行的处理有影响。

自己创建的队列可以指定优先级,但是全局队列的优先级总是默认的,可以通过 dispatch_set_target_queue 来改变全局队列的优先级。

第一个参数:

指定要被变更优先级的队列

第二个参数:

指定一个队列,会把这个队列的优先级指定给第一个参数中的队列

如果在多个 Serial Dispatch Queue 中用 dispatch_set_target_queue 函数指定目标为某一个 Serial Dispatch Queue,那么原先本应并行执行的多个 Serial Dispatch Queue,在目标 Serial Dispatch Queue 上只能同时执行一个处理。


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-82647-1.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    每日福利
    热点图片
    拼命载入中...