Stream Programming Guide: Polling versus Run-Loop Scheduling 部分下,最后一段说:



因此,似乎 hasBytesAvailable/hasSpaceAvailable 和流事件都不能保证防止阻塞。有什么方法可以保证流的非阻塞行为?我可以创建一个后台线程来保证非阻塞行为,但我想避免这样做。

另外,我不明白为什么 NSStream 不能提供保证的非阻塞行为,因为低级 API(select、kqueue 等)可以这样做。有人可以解释为什么会这样吗?

最佳答案

你要么在不同的线程中运行你的阅读或写作,要么你不能使用 NSStream。没有其他方法可以保证非阻塞行为。

对于常规文件和套接字,如果您在运行循环上安排流,您很可能会获得非阻塞行为。但是还有其他类型的流没有在文件描述符之上实现。通过将基类记录为并不总是非阻塞的,Apple 以一种他们无法保证非阻塞属性的方式保持了实现不同流的选项。

但由于我们无法检查源代码,因此我们只能对此进行推测。您可能想向 Apple 提交错误,要求他们使用该信息更新文档。

关于objective-c - NSStream : Is there any airtight defense against blocking?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30951833/

10-10 06:30