比‏分‏类的AP‏P,如‏何‏找?求回答

桥牌怎么玩_湖南省衡南县职业中等专业学校_新浪财经
桥牌怎么玩
日 01:08 来源:
对于量子云估值溢价率超高的问题,《每日经济新闻》记者5月9日致电瀚叶股份证券部,公司相关人士表示,目前量子云100%股权38亿元只是一个预估值,正式的评估结果还没有出炉。公司会根据正式的评估报告发布最新的情况。
随后,我联系Apple Care,他们向我保证,说可以更换。他们还说,在系统内找不到苹果代表提交的追踪订单,我之前可是说过的啊。我只好再次回到苹果店铺,让苹果代表再次查看笔记本,确定橡胶垫丢了。我希望苹果代表打电话给原来去的那家店,确认此事。他们同意了,最终也确认了。
“和全球政府之间的合作非常重要,了解他们对AI的看法——并且帮助他们了解更多,”谷歌AI负责人兼Alphabet的顶级计算机科学家杰夫·迪恩(Jeff Dean)在本周二采访中说道。
未来,58集团的用户体验、商户端效率、商业模式可能都会发生巨变,我们正在顺势而为,推动行业更好地利用技术,更好地利用中国移动端在线比例比较高的优势,不断推进发展。在实现自我技术创新的同时,58集团也在通过产品创新让平台上的合作商家、中小微客户甚至是个人能够在服务业里面更好的创业,更好的生存,我觉得这是我们的责任。
联想手机的一个应对是渠道变革。
《迷你世界》的玩家被一部分《我的世界》玩家叫作“迷你狗”;相对的,许多《我的世界》玩家,也被一些《迷你世界》玩家叫作“MC痴”。
据《华尔街日报》报道,正在为赴港IPO做准备的中国智能手机制造商小米设定的目标估值在700亿美元(约合4456亿元)至800亿美元(5092亿元)之间,低于此前宣称的1000亿美元(约合6367亿元)估值。
事实上在服务器芯片市。?酒?尥酚⑻囟?涤凶啪?缘摹盎坝锶ā。
中国建厂需解三大问题
国内的大型面板制造企业,京东方、华星光电、维信诺、天马等厂商的柔性屏、全面屏、异形屏等产品纷纷问世,国产高端屏幕进展迅速。2018年,中国也将有多条OLED面板线投产或扩产,全球影响力将进一步增强。未来3至5年以OLED面板为主的投入规模可以达到300亿至500亿美元,涨势喜人。
乐视网的经营状况从去年第二季度以来大幅恶化,包括公司营业收入、净利润等出现大幅下滑。深交所要求乐视网逐项列式截至2017年度公司融资借款、经营性往来等各类负债情况,包括负债主体、负债金额、到期日、利率、利息负担、融资用途等。同时深交所要求结合公司当前生产经营情况和财务状况,说明乐视网是否可能触发净资产为负导致暂停上市的情形。另外针对去年乐视网广告业务收入较2016年大幅下滑,问询函不仅要求乐视网结合最近三年不同业务模式的广告主数量和广告收入变化趋势、市场竞争地位,说明广告业务收入大幅下滑的原因,同时还要求其以大客户案例详细说明对于广告置换业务、广告返利业务、广告投放后撤单、按照广告投放效果结算等特殊情形下的会计处理。文/本报记者
当然,Android P 手势并非十全十美,国外也有不少媒体对其感到不满。正如在 Android P 体验文中所说,如今“呼出应用抽屉”的操作比以前更繁琐(虽然国内 Android 手机都默认取消了应用抽屉),横条滑动时的位置在左手持机时也会有些别扭。
虽然华为nova 3e并不具备iPhone X那样的3D传感器,但是依旧拥有人脸识别功能,除此之外,华为nova 3e还保持了EMUI一贯丰富的手势操作、手势截图、游戏模式等实用的功能。
在武汉科技大学金融证券研究所所长董登新看来,乐视网是否会暂停上市还是要尊重法规,法律规定的暂停上市情形包括连续亏损三年、净资产为负或者是重大违法等,还要继续观察乐视网的动向,如果乐视网做不下去了要破产,那它当然要暂停上市或者退市。
5月8日,公安部通报称,近期公安部督办指导各地连续侦破一大批利用网游平台开设赌场重大案件,成功摧毁多个以合法经营资质为掩护,通过棋牌、娱乐游戏设赌牟利的网络游戏平台。
彭博社在此前给特斯拉做了一份详细的数据分析,得出的结论是:
记者:我们在采访中发现,有的医疗平台对于就医出现问题后的责任认定语焉不详,这方面应该采取哪些措施进一步明确?
微博预计2018年第二季度净营收将在4.2亿美元至4.3亿美元之间,这一预期假定人民币对美元汇率的均值为6.35元人民币兑1美元。上述预期体现的是微博当前的初步判断,未来可能进行调整。Error_404_资源不存在
404. 抱歉! 您访问的资源不存在!
请确认您输入的网址是否正确,如果问题持续存在,请发邮件至contact@cnblogs.com与我们联系。runloop源码解读笔记 - 简书
runloop源码解读笔记
跟多数开发者一样,我也曾经迷惑于runloop,最初只了解可以通过runloop一些监听事件的通知来做一些事情,优化性能。关于runloop源码的基础知识,本文不做论述,可以参考众神的文章:
本文将对以上科普性文章之外的一些源码内容进行解读,便于日后自己和大家查阅。
p.s. 本文中代码部分均有删减,仅供参考。
runloop超时
在runloop源码的核心方法__CFRunLoopRun中,在进入核心的 do while循环之前,先使用 dispatch启动了一个计时器:
static int32_t __CFRunLoopRun(CFRunLoopRef rl, CFRunLoopModeRef rlm, CFTimeInterval seconds, Boolean stopAfterHandle, CFRunLoopModeRef previousMode) {
uint64_t startTSR = mach_absolute_time();
dispatch_source_t timeout_timer = NULL;
struct __timeout_context *timeout_context = (struct __timeout_context *)malloc(sizeof(*timeout_context));
if (seconds &= 0.0) { // instant timeout
seconds = 0.0;
timeout_context-&termTSR = 0ULL;
} else if (seconds &= TIMER_INTERVAL_LIMIT) {
dispatch_queue_t queue = pthread_main_np() ? __CFDispatchQueueGetGenericMatchingMain() : __CFDispatchQueueGetGenericBackground();
timeout_timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
dispatch_retain(timeout_timer);
timeout_context-&ds = timeout_
timeout_context-&rl = (CFRunLoopRef)CFRetain(rl);
timeout_context-&termTSR = startTSR + __CFTimeIntervalToTSR(seconds);
dispatch_set_context(timeout_timer, timeout_context); // source gets ownership of context
dispatch_source_set_event_handler_f(timeout_timer, __CFRunLoopTimeout);
dispatch_source_set_cancel_handler_f(timeout_timer, __CFRunLoopTimeoutCancel);
uint64_t ns_at = (uint64_t)((__CFTSRToTimeInterval(startTSR) + seconds) * ULL);
dispatch_source_set_timer(timeout_timer, dispatch_time(1, ns_at), DISPATCH_TIME_FOREVER, 1000ULL);
dispatch_resume(timeout_timer);
} else { // infinite timeout
seconds = .0;
timeout_context-&termTSR = UINT64_MAX;
计时器的超时时间从哪里来?
这里的计时器用来做什么?
带着这两个问题我们继续看源码:
首先可以看出超时时间是根据 __CFRunLoopRun 的入参seconds计算的,而__CFRunLoopRun入参从哪里来,顺着源码可以找到 CFRunLoopRunSpecific, 再向上可以找到两处调用:
void CFRunLoopRun(void) {
/* DOES CALLOUT */
result = CFRunLoopRunSpecific(CFRunLoopGetCurrent(), kCFRunLoopDefaultMode, 1.0e10, false);
CHECK_FOR_FORK();
} while (kCFRunLoopRunStopped != result && kCFRunLoopRunFinished != result);
SInt32 CFRunLoopRunInMode(CFStringRef modeName, CFTimeInterval seconds, Boolean returnAfterSourceHandled) {
/* DOES CALLOUT */
CHECK_FOR_FORK();
return CFRunLoopRunSpecific(CFRunLoopGetCurrent(), modeName, seconds, returnAfterSourceHandled);
同时,我们可以在头文件中看到这两个方法:
CF_EXPORT void CFRunLoopRun(void);
CF_EXPORT SInt32 CFRunLoopRunInMode(CFStringRef mode, CFTimeInterval seconds, Boolean returnAfterSourceHandled);
从而可以知道,runloop开放了两种启动runloop的方式,
一种是默认启动方式,此时不配置seconds,即未设置超时;
一种是自定义启动方式,可以配置seconds的超时时间,以及其他mode等参数;
第一个问题解答完,我们再看第二个问题。
我们知道dispatch 计时器达到超时时间,会调用dispatch_source_set_event_handler_f 中配置的回调函数(也可以用dispatch_source_set_event_handler配置block),这里的回调函数是__CFRunLoopTimeout,源码如下:
static void __CFRunLoopTimeout(void *arg) {
struct __timeout_context *context = (struct __timeout_context *)
context-&termTSR = 0ULL;
CFRUNLOOP_WAKEUP_FOR_TIMEOUT();// 没啥X用
CFRunLoopWakeUp(context-&rl);
// The interval is DISPATCH_TIME_FOREVER, so this won't fire again
void CFRunLoopWakeUp(CFRunLoopRef rl) {
ret = __CFSendTrivialMachMessage(rl-&_wakeUpPort, 0, MACH_SEND_TIMEOUT, 0);
if (ret != MACH_MSG_SUCCESS && ret != MACH_SEND_TIMED_OUT) CRASH("*** Unable to send message to wake up port. (%d) ***", ret);
static uint32_t __CFSendTrivialMachMessage(mach_port_t port, uint32_t msg_id, CFOptionFlags options, uint32_t timeout) {
kern_return_
mach_msg_header_
result = mach_msg(&header, MACH_SEND_MSG|options, header.msgh_size, 0, MACH_PORT_NULL, timeout, MACH_PORT_NULL);
if (result == MACH_SEND_TIMED_OUT) mach_msg_destroy(&header);
从上面源码可以看出超时到达时,主要做的就是通过 __CFSendTrivialMachMessage再调用mach_msg发送消息,mach_msg参数已经配置了“发送模式”、“超时时间”、唤醒的端口为“rl-&_wakeUpPort”,基于文章, 我们可以知道,runloop在休眠时,接收到mach发来的消息,会判断port,决定作何判断和处理:
if (MACH_PORT_NULL == livePort)
CFRUNLOOP_WAKEUP_FOR_NOTHING();
else if (livePort == rl-&_wakeUpPort)
CFRUNLOOP_WAKEUP_FOR_WAKEUP();
else if (rlm-&_timerPort != MACH_PORT_NULL && livePort == rlm-&_timerPort)
// 处理timer
else if (livePort == dispatchPort)
// 处理主线程队列中事件
__CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__(msg);
// 处理Source1
sourceHandledThisLoop = __CFRunLoopDoSource1(rl, rlm, rls, msg, msg-&msgh_size, &reply) || sourceHandledThisL
也就是我们通过dispatch 定时器的可以将超时的消息通过mach ,唤醒runloop,然后执行else if (livePort == rl-&_wakeUpPort)分支来处理超时(目前源码中CFRUNLOOP_WAKEUP_FOR_WAKEUP 只是一个空的宏定义,未做任何处理)。所以第二个问题答案就是这个计时器是用来在指定时间后唤醒runloop的。
mach_msg入参
mach_msg源码不知在何方,以下只是根据源码猜测,供参考。
我们从源码中摘录几个调用的地方:
mach_msg_header_t *msg = (mach_msg_header_t *)*
msg-&msgh_bits = 0;
msg-&msgh_local_port =
msg-&msgh_remote_port = MACH_PORT_NULL;
msg-&msgh_size = buffer_
msg-&msgh_id = 0;
if (TIMEOUT_INFINITY == timeout) { CFRUNLOOP_SLEEP(); } else { CFRUNLOOP_POLL(); }
ret = mach_msg(msg, MACH_RCV_MSG|(voucherState ? MACH_RCV_VOUCHER : 0)|MACH_RCV_LARGE|((TIMEOUT_INFINITY != timeout) ? MACH_RCV_TIMEOUT : 0)|MACH_RCV_TRAILER_TYPE(MACH_MSG_TRAILER_FORMAT_0)|MACH_RCV_TRAILER_ELEMENTS(MACH_RCV_TRAILER_AV), 0, msg-&msgh_size, port, timeout, MACH_PORT_NULL);
mach_msg(reply, MACH_SEND_MSG, reply-&msgh_size, 0, MACH_PORT_NULL, 0, MACH_PORT_NULL);
mach_msg_header_
header.msgh_bits = MACH_MSGH_BITS(MACH_MSG_TYPE_COPY_SEND, 0);
header.msgh_size = sizeof(mach_msg_header_t);
header.msgh_remote_port =
header.msgh_local_port = MACH_PORT_NULL;
header.msgh_id = msg_
result = mach_msg(&header, MACH_SEND_MSG|options, header.msgh_size, 0, MACH_PORT_NULL, timeout, MACH_PORT_NULL);
从上面三个调用可以猜测:
第一个参数就发送消息内容msg,msg的结构体里定义了消息的收发两方的port及其他内容;
第二个参数属于消息发送或接收的类型,通过宏定义已经定义好类型;
第三个参数应该是用于接收者申请额外存储空间暂存消息,便于自己处理,不对源消息的空间有耦合;
倒数第二个参数表示等待时间,如果是0表示发送或接收后立刻返回,如果是TIMEOUT_INFINITY,就阻塞地等待有消息,直到参数1对应port有消息才返回,继续执行后面的代码;
在runloop中多次提到port,比如基于port的source1就是就是休眠时候的唤醒源之一,比如休眠时监听消息 __CFRunLoopServiceMachPort也是通过port。
那么port是啥?Mach消息是在端口(Port)之间进行传递。一个端口只能有一个接收者,而可以同时有多个发送者。向一个端口发送消息,实际上是将消息放在一个消息队列中,直到消息能被接收者处理。
从源码中可见port类型是__CFPort /mach_port_name_t /mach_port_t,而mach_port_name_t就是无符号整数,也就是端口的索引值。源码中涉及到的port有几种类型:
// 这个port就对应NSTimer;
mach_port_t _timerP
// 这个port对应主线程
mach_port_name_t dispatchPort = MACH_PORT_NULL;
dispatchPort = _dispatch_get_main_queue_port_4CF();
// 这个port唤醒runloop
if (livePort == rl-&_wakeUpPort)
还记得__CFRunLoopRun方法中休眠时监听的port集合吗?
// 第七步,进入循环开始不断的读取端口信息,如果端口有唤醒信息则唤醒当前runLoop
__CFPortSet waitSet = rlm-&_portS
if (kCFUseCollectableAllocator)
memset(msg_buffer, 0, sizeof(msg_buffer));
// waitSet 为所有需要监听的port集合, TIMEOUT_INFINITY表示一直等待
msg = (mach_msg_header_t *)msg_
__CFRunLoopServiceMachPort(waitSet, &msg, sizeof(msg_buffer), &livePort, poll ? 0 : TIMEOUT_INFINITY, &voucherState, &voucherCopy);
而这里的waitSet就是__CFPortSet ,也就是port的集合,那么__CFPortSet是什么类型呢?这个集合涉及哪些操作呢?
typedef mach_port_t __CFPortS
CF_INLINE kern_return_t __CFPortSetInsert(__CFPort port, __CFPortSet portSet) {
if (MACH_PORT_NULL == port) {
return -1;
return mach_port_insert_member(mach_task_self(), port, portSet);
也就说__CFPortSet的类型也是mach_port_t,即无符号整数。那么__CFPortSetInsert操作猜测应该就是按bit位来操作,不同bit位表示不同的port类型。__CFRunLoopServiceMachPort的参数入参__CFPort类型自然也可以传入waitSet,在其内部遍历各个bit位来监听各个port的消息。
另外,runloop休眠阶段的轮询的port集合是如何确定的呢?通过源码发现,正是__CFRunLoopFindMode方法中将各个port插入到waitSet中的:
static CFRunLoopModeRef __CFRunLoopFindMode(CFRunLoopRef rl, CFStringRef modeName, Boolean create)
kern_return_t ret = KERN_SUCCESS;
#if USE_DISPATCH_SOURCE_FOR_TIMERS
rlm-&_timerFired =
rlm-&_queue = _dispatch_runloop_root_queue_create_4CF("Run Loop Mode Queue", 0);
mach_port_t queuePort = _dispatch_runloop_root_queue_get_port_4CF(rlm-&_queue);
if (queuePort == MACH_PORT_NULL) CRASH("*** Unable to create run loop mode queue port. (%d) ***", -1);
rlm-&_timerSource = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, rlm-&_queue);
__block Boolean *timerFiredPointer = &(rlm-&_timerFired);
dispatch_source_set_event_handler(rlm-&_timerSource, ^{
*timerFiredPointer =
// Set timer to far out there. The unique leeway makes this timer easy to spot in debug output.
_dispatch_source_set_runloop_timer_4CF(rlm-&_timerSource, DISPATCH_TIME_FOREVER, DISPATCH_TIME_FOREVER, 321);
dispatch_resume(rlm-&_timerSource);
ret = __CFPortSetInsert(queuePort, rlm-&_portSet);
if (KERN_SUCCESS != ret) CRASH("*** Unable to insert timer port into port set. (%d) ***", ret);
#if USE_MK_TIMER_TOO
rlm-&_timerPort = mk_timer_create();
ret = __CFPortSetInsert(rlm-&_timerPort, rlm-&_portSet);
if (KERN_SUCCESS != ret) CRASH("*** Unable to insert timer port into port set. (%d) ***", ret);
ret = __CFPortSetInsert(rl-&_wakeUpPort, rlm-&_portSet);
if (KERN_SUCCESS != ret) CRASH("*** Unable to insert wake up port into port set. (%d) ***", ret);
CFSetAddValue(rl-&_modes, rlm);
CFRelease(rlm);
__CFRunLoopModeLock(rlm);
/* return mode locked */
从上面的三个__CFPortSetInsert可以发现分别插入了queuePort、_timerPort、_wakeUpPort;另外在CFRunLoopAddSource方法中还将source1的port插入其中:
__CFPort src_port = rls-&_context.version1.getPort(rls-&_context.version1.info);
if (CFPORT_NULL != src_port)
CFDictionarySetValue(rlm-&_portToV1SourceMap, (const void *)(uintptr_t)src_port, rls);
__CFPortSetInsert(src_port, rlm-&_portSet);
再加上__CFRunLoopRun方法中加入的dispatchPort ,至此,waitSet中已经包含了可以唤醒runloop的所有port。
什么是runloop? 一般来讲,一个线程一次只能执行一个任务,执行完成后线程就会退出。如果我们需要一个机制,让线程能随时处理事件但并不退出,通常的代码逻辑是这样的: functionloop(){initialize();do{varmessage=get_next_me...
深入理解RunLoop由 ibireme |
| iOS, 技术RunLoop 是 iOS 和 OSX 开发中非常基础的一个概念,这篇文章将从 CFRunLoop 的源码入手,介绍 RunLoop 的概念以及底层实现原理。之后会介绍一下在 iOS 中,...
转载:http://www.cocoachina.com/ios/70.html RunLoop 是 iOS 和 OS X 开发中非常基础的一个概念,这篇文章将从 CFRunLoop 的源码入手,介绍 RunLoop 的概念以及底层实现原理。之后会介...
RunLoop 的概念 一般来讲,一个线程一次只能执行一个任务,执行完成后线程就会退出。如果我们需要一个机制,让线程能随时处理事件但并不退出,通常的代码逻辑是这样的: function loop() { initialize(); do { var message = ge...
原文地址:http://blog.ibireme.com//runloop/ RunLoop 是 iOS 和 OSX 开发中非常基础的一个概念,这篇文章将从 CFRunLoop 的源码入手,介绍 RunLoop 的概念以及底层实现原理。之后会介绍一下在 ...
女人保养是老样子,不保养那就是样子老!连宝马车不保养也会提前退休,更何况是小婊妹们这张脸!所以女人应该从20岁就开始保养皮肤,这样才保持青春,才能美丽自信啊!那咋保养呢??首先,第一部,针对所有人群。 不要再熬夜啦!! 看到没有!血淋淋的事实啊!小仙女们是不是看完觉得很震惊...
在各种论坛上经常能遇到针对女生喝什么类型酒较好的问题,比如“哪些酒适合女生饮用?”或者“求推荐几款适合女性的红酒”。有时我怀疑,提问的究竟是对葡萄酒感兴趣的女孩子,还是那些“热心体贴”,希望女友多喝几杯的男生。 毕竟,从来没人问“哪些菜适合女生吃”或者“女神应该点几分熟的牛...
澳门作为中国的一个特别行政区,经过100多年的欧洲文化洗礼,是很多游客向往的地方。 今年年初就去办了澳门签证,终于在这个月和朋友们一起去旅游一下下。 我们一大早就坐上去珠海拱北口岸的大巴车,经过两个多小时的车程,到达拱北口岸,还没出境的时候,在附件兑换了100元人民币,(特...
这节ps教程来讲下工具箱中的“历史记录画笔工具”,不会的小伙伴,可以认真来学习下。 历史记录画笔工具是用来对图像进行局部恢复。 打开photoshop软件,在工具箱中,找到历史记录画笔工具,快捷键是“Y”键,效果如图所示。 历史记录画笔工具 在历史记录画笔工具前面,有画笔工...
上一話 「此山是我开,此树是我栽,若要打此过,留下买路财!」 「程大哥,我们是来打匪的,不是当匪的,你说的甚么话啊?」抡着大锤的蔡建德说道。 「哈哈,这几句诗说起来很好玩啊,你也试试吧!」 绿意盎然的山头上,身穿布衣的程咬金,横着一根赤铁长槊,与一班土匪对峙着。 「你们是甚...

我要回帖

更多关于 小比类卷香莲 的文章

 

随机推荐