ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

第44月第20天 The dispatch_queue_set_specific() and dispatch_get_specific() functions take a "void *

2020-05-20 14:02:58  阅读:317  来源: 互联网

标签:queue functions socketQueue void get dispatch specific


1.

76     //socket队列的标识key
77     void *IsOnSocketQueueOrTargetQueueKey;
 88           void *nonNullUnusedPointer = (__bridge void *)self;
 89 
 90         //dispatch_queue_set_specific给当前队里加一个标识 dispatch_get_specific当前线程取出这个标识,判断是不是在这个队列
 91         //这个key的值其实就是一个一级指针的地址  ,第三个参数把自己传过去了,上下文对象?第4个参数,为销毁的时候用的,可以指定一个函数
 92           dispatch_queue_set_specific(socketQueue, IsOnSocketQueueOrTargetQueueKey, nonNullUnusedPointer, NULL);


3.生成了一个socketQueue,这个queue是串行的,接下来我们看代码就会知道它贯穿于这个类的所有地方。所有对socket以及一些内部数据的相关操作,都需要在这个串行queue中进行。这样使得整个类没有加一个锁,就保证了整个类的线程安全。

  • 接着我们回到正题上,我们定义了一个Block,所有的连接操作都被包裹在这个Block中。我们做了如下判断:
  //在socketQueue中执行这个Block
  if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey))
      block();
  //否则同步的调起这个queue去执行
  else
      dispatch_sync(socketQueue, block);

保证这个连接操作一定是在我们的socketQueue中,而且还是以串行同步的形式去执行,规避了线程安全的问题。



https://blog.csdn.net/weixin_30402343/article/details/95261039?fps=1&locationNum=2

标签:queue,functions,socketQueue,void,get,dispatch,specific
来源: https://www.cnblogs.com/javastart/p/12923228.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有