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

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

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

在必须将不可并行执行的处理追加到多个 Serial Dispatch Queue 中时,如果使用 dispatch_set_target_queue 函数将目标指定为某一个 Serial Dispatch Queue,即可防止处理并行执行。

以下代码:

的执行结果为:

该函数按指定的次数将指定的 Block 追加到指定的 Dispatch Queue 中,并 等待全部处理执行结束。

例如下面代码:

semaphore java用法_semaphore_semaphore c语言

执行结果为:

每一次打印都是并发执行的,并且 done 一定会在最后打印。semaphore

在不需要关心顺序的情况下,可以用 dispatch_apply 来遍历 NSArray,NSDictionary,NSSet 等,这种方式执行效率比直接循环遍历要高,但是可能更费电(因为要开辟和切换线程)。

由于 dispatch_apply 会阻塞当前线程,可以根据需要在 dispatch_async 中执行 dispatch_apply,例如:

dispatch_apply 其内部是结合了 dispatch_sync 和 Dispatch Group 的调用来实现的。

Dispatch Semaphore 是持有计数的信号量。

dispatch_semaphore_create 创建一个信号量,并通过参数指定信号量持有的计数。

dispatch_semaphore_signal 将信号量持有计数增加 1。

dispatch_semaphore_wait 函数会判断信号量持有计数的值,如果计数为 1 或大于 1,函数会直接返回。

如果计数为 0,函数会阻塞当前线程并一直处于等待状态不返回,直到信号量计数变为大于等于 1,dispatch_semaphore_wait 才会停止等待并返回。

dispatch_semaphore_wait 支持设置一个等待时间,如果到了这个时间,即使信号量计数不是大于等于 1,函数也会停止等待并返回。

上面函数在执行过程是会先打印 here 1,然后阻塞住当前线程 1 秒钟,然后打印 here 2,然后函数返回,调用结束。

下面代码并发的、不考虑顺序地给 NSArray 添加对象。

执行上面代码会有很大概率发生崩溃,因为并发的执行很容易发生内存错误。

这时可以用 Dispatch Semaphore 来细粒度地控制同一时间的并发执行次数。把上面代码改为以下代码即可避免发生崩溃。

上面代码中用 dispatch_semaphore_create(1)创建了一个持有计数为 1 信号量 semaphore。然后把具体要限制并发次数的操作用一对 dispatch_semaphore_wait 和 dispatch_semaphore_signal 包含在其中。这样避免了 addObject 在同时多次并发执行时可能出现的问题。

dispatch_semaphore_wait 有返回值,上面代码也可以这么写,效果是一样的。semaphore


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

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

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