多线程中栅栏函数

  • 在撸代码的过程中,遇到一个小小的纠结的地方,有关于栅栏函数的,花费一个小时查了文档,记录下来
//GCD是基于C的,所有barrier是函数 
//GCD中的barrier函数有两种形式
//第一种  实质上还是异步函数
dispatch_barrier_async(dispatch_queue_t queue, dispatch_block_t block);

//第二种  实质上还是同步函数
dispatch_barrier_sync(dispatch_queue_t queue, dispatch_block_t block);

  • 在barrier实际的用途中,有几个注意点:
//无论barrier函数的async还是sync,文档中都是要求和自定义的并发队列配合使用
/* @discussion
 * Submits a function to a dispatch queue like dispatch_async_f(), but marks
 * that function as a barrier (relevant only on DISPATCH_QUEUE_CONCURRENT
 * queues).
 */
  • dispatch_barrier_async(dispatch_queue_t queue, dispatch_block_t block) //异步

    • 与dispatch_get_global_queue(0, 0);(全局并发队列)一起使用,达不到栅栏的效果,官方文档有说;
    • 与dispatch_get_main_queue()(主队列)一起使用,barrier前后任务串行执行,都在UI线程执行
    • 与dispatch_queue_create(NULL, DISPATCH_QUEUE_SERIAL)(串行队列)一起使用,会创建一个线程,barrier前后的任务串行执行
    • 与dispatch_queue_create(NULL, DISPATCH_QUEUE_CONCURRENT)(自定义并发队列)一起使用,创建多个线程,barrier前后的任务都是并行执行.
  • dispatch_barrier_sync(dispatch_queue_t queue, dispatch_block_t block) //同步

    • 与dispatch_get_global_queue(0, 0);(全局并发队列)一起使用,达不到栅栏的效果,官方文档有说;
    • 与dispatch_get_main_queue()(主队列)一起使用,程序会进入死锁状态!!!!!!!!(这个很容易忽略)
    • 与dispatch_queue_create(NULL, DISPATCH_QUEUE_SERIAL)(串行队列)一起使用,barrier在UI线程运行
    • 与dispatch_queue_create(NULL, DISPATCH_QUEUE_CONCURRENT)(自定义并发队列)一起使用,barrier在UI线程运行
  • 所以, ,barrier函数一般都会用异步的,省心,不担心死锁.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容