gpt4 book ai didi

objective-c - performSelectorOnMainThread : 实现的底层细节

转载 作者:太空狗 更新时间:2023-10-30 03:31:36 26 4
gpt4 key购买 nike

想知道是否有人知道 Cocoa 的“performSelectorOnMainThread:”方法的低级实现细节,或者有好的文档的指针。

我最好的猜测,而且我认为可能非常接近,是它使用 mach 端口或在它们之上的抽象来提供线程内通信,将选择器信息作为 mach 消息的一部分传递。

对吧?错误的?谢谢!

更新 09:39AMPST

感谢 Evan DiBiase 和 Mecki 的回答,但要澄清一下:我了解运行循环中发生的事情,但我正在寻找答案的是; “方法在何处排队?选择器信息如何传递到队列中?”寻找的不仅仅是 Apple 的文档信息:我读过它们

太平洋标准时间 14:21 更新

Chris Hanson 在评论中提出了一个很好的观点:我的目标不是学习底层机制以便在我自己的代码中利用它们。相反,我只是想从概念上更好地理解向另一个线程发出信号以执行代码的过程。正如我所说,我自己的研究使我相信它利用了 IPC 的 mach 消息传递来在线程之间传递选择器信息,但我专门寻找关于正在发生的事情的具体信息,所以我可以确保我正确地理解了事情。谢谢!

更新 03/06/09

我对这个问题悬赏了,因为我真的很想看到它的答案,但是如果你想收集,请确保你阅读了所有内容,包括所有当前提出的答案,对这些答案和我原来的问题的评论,以及我在上面发布的更新文本。我正在寻找 performSelectorOnMainThread: 等使用的机制的最低级细节,正如我之前提到的,我怀疑它与 Mach 有关端口,但我真的很想知道。除非我能确认给出的答案是正确的,否则不会授予赏金。谢谢大家!

最佳答案

是的,它确实使用了 Mach 端口。这是怎么回事:

  1. 封装执行信息(目标对象、选择器、选择器的可选对象参数等)的数据 block 在线程的运行循环信息中排队。这是使用 @synchronized 完成的,它最终使用 pthread_mutex_lock
  2. 调用 CFRunLoopSourceSignal 以发出源已准备好发射的信号。
  3. 调用 CFRunLoopWakeUp 让主线程的运行循环知道该唤醒了。这是使用 mach_msg 完成的。

来自 Apple 文档:

Version 1 sources are managed by the run loop and kernel. These sources use Mach ports to signal when the sources are ready to fire. A source is automatically signaled by the kernel when a message arrives on the source’s Mach port. The contents of the message are given to the source to process when the source is fired. The run loop sources for CFMachPort and CFMessagePort are currently implemented as version 1 sources.

我现在正在查看堆栈跟踪,这就是它显示的内容:

0 mach_msg
1 CFRunLoopWakeUp
2 -[NSThread _nq:]
3 -[NSObject(NSThreadPerformAdditions) performSelector:onThread:withObject:waitUntilDone:modes:]
4 -[NSObject(NSThreadPerformAdditions) performSelectorOnMainThread:withObject:waitUntilDone:]

在 mach_msg 上设置断点,您将能够确认它。

关于objective-c - performSelectorOnMainThread : 实现的底层细节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/149388/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com