想知道是否有人知道或有指向讨论 Cocoa 的“performSelectorOnMainThread:”方法的低级实现细节的良好文档。
我最好的猜测(我认为可能非常接近)是它使用 mach 端口或它们之上的抽象来提供线程内通信,将选择器信息作为 mach 消息的一部分传递。
正确的?错误的?
更新时间 09:39 AMST
感谢 Evan DiBiase 和 Mecki 的回答,但需要澄清一下:我理解运行循环中发生的情况,但我正在寻找的答案是; ”where该方法是否正在排队?how选择器信息是否被传递到队列中?” 寻找的不仅仅是苹果的文档信息:我已经阅读了它们
太平洋标准时间 14:21 更新
Chris Hanson 在评论中提出了一个很好的观点:我的目标不是学习底层机制以便在我自己的代码中利用它们。相反,我只是想更好地概念性地理解向另一个线程发送信号以执行代码的过程。正如我所说,我自己的研究使我相信它利用 IPC 的马赫消息传递在线程之间传递选择器信息,但我专门寻找concrete有关正在发生的事情的信息,因此我可以确定我理解事情正确地。谢谢!
更新 03/06/09
我正在寻找最低级别的细节所使用的机制performSelectorOnMainThread:
等等,正如我之前提到的,我怀疑这与马赫端口有关,但我真的很想确定。
是的,它确实使用 Mach 端口。发生的事情是这样的:
- 封装执行信息(目标对象、选择器、选择器的可选对象参数等)的数据块在线程的运行循环信息中排队。这是使用完成的
@synchronized
,最终使用pthread_mutex_lock
.
- CFRunLoop Source Signal 被调用以发出信号源已准备好触发。
- 调用 CFRunLoopWakeUp 是为了让主线程的运行循环知道是时候醒来了。这是使用 mach_msg 完成的。
来自苹果文档:
版本 1 源由运行循环和内核管理。这些源使用马赫端口在源准备好发射时发出信号。当消息到达源的 Mach 端口时,内核会自动向源发出信号。当源被触发时,消息的内容被提供给源进行处理。 CFMachPort 和 CFMessagePort 的运行循环源当前作为版本 1 源实现。
我现在正在查看堆栈跟踪,这就是它显示的内容:
0 mach_msg
1 CFRunLoopWakeUp
2 -[NSThread _nq:]
3 -[NSObject(NSThreadPerformAdditions) performSelector:onThread:withObject:waitUntilDone:modes:]
4 -[NSObject(NSThreadPerformAdditions) performSelectorOnMainThread:withObject:waitUntilDone:]
在 mach_msg 上设置断点,您就可以确认它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)