0
|
Roflcopter4 · 技术社区 · 6 年前 |
1
2
总有一种方法来决定大小。否则,程序将需要无限的内存,因此不可能在物理计算机上运行。 这样想:即使在数据源源不断的情况下,也必须有一些块或点,你必须处理它。例如,直播视频必须解码其中的一部分(例如帧)。或者一个视频游戏,一个接一个地处理信息,即使游戏的长度不确定。 无论您决定使用哪种类型的I/O(阻塞/非阻塞、同步/异步…),这都是正确的。例如,如果你想使用典型的阻塞同步I/O,你所要做的就是在循环中处理数据:每次迭代,你可以读取尽可能多的数据,并尽可能多地处理。无论你不能处理什么(因为你还没有收到足够多的数据),你会继续进行下一次迭代。然后,循环的其余部分就是程序逻辑的其余部分。 最后,不管你做什么,你(或其他人,例如一个库,操作系统,硬件缓冲器…)必须缓冲传入的数据,直到它可以被处理。 |
2
1
基本上,有两种选择——同步或异步——它们都有各自的优缺点。 对于synchronous,您需要delimeters或一个嵌入到记录中的长度字段(或固定长度的记录,但这是非常不灵活的)。这对于同步协议(如同步rpc或simplex客户机-服务器交互)最有效,在这种情况下,一次只有一方在说话,而另一方在等待。对于基于ascii/文本的协议,通常使用控制字符分隔符(如nl/eol、nul或ctx)来标记消息的结尾。二进制协议通常使用嵌入的长度字段——接收器首先读取长度,然后读取全部(预期的)数据。
对于异步,使用非阻塞模式。在stdio流中使用非阻塞模式是可能的,只是需要一些注意。数据外条件显示为类stdio错误条件,因此需要使用
两者都可以使用——例如,在客户机-服务器交互中,客户机可以使用同步(它们发送请求并等待答复),而服务器使用异步(在出现行为不正常的客户机时是健壮的)。 |
3
0
这个
这意味着,当从管道读取时,设置缓冲区大小,尽可能多地读取和处理过程。然后你读下一段。唯一被阻塞的时间是没有数据可用。
这与
|
Community wiki · C中有哪些耗时的操作? 1 年前 |
Community wiki · 将所有处理器电源都投入到任务中 1 年前 |
Community wiki · C++为C添加了什么?[已关闭] 1 年前 |
Community wiki · 打印1到1000,不带循环或条件 1 年前 |