- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我很难在文档中找到明确的答案。
我想知道取消异步读取或写入操作然后重新启动操作是否会导致数据流损坏?
详细阅读:如果 async_read_some 操作正在运行:
我能确定当我开始一个新的 async_read_some 操作时,没有数据丢失吗? IE。当处理程序返回 operation_aborted 错误时,没有数据被读取?
同样适用于 async_write_some 操作。当我取消操作时,等待处理程序完成,处理结果(我再次知道返回不需要operation_aborted),然后开始写入剩余数据,流是否可能重复数据? IE。 cancel会不会导致恢复写入时数据重复写入?
最佳答案
cancel()
本身不会导致流中的数据丢失或重复。如果应用程序满足以下条件,数据丢失或重复只会发生在应用程序协议(protocol)中:
正确处理传递给完成处理程序的 error_code
和 bytes_transferred
将防止这种形式的数据丢失或重复。如果 bytes_transferred
大于 0
,则数据已从套接字读入缓冲区或从缓冲区写入套接字。请注意,如果某个操作已被调用或在不久的将来排队等待调用,则该操作将不再可取消。考虑以下场景,其中 socket
有 42
字节可供读取:
assert(socket.available() == 42);
std::array<char, 32> buffer;
socket.async_read_some(boost::asio::buffer(buffer), ...); // op 1
socket.cancel();
socket.async_read_some(boost::asio::buffer(buffer), ...); // op 2
io_service.run();
如果 op 1
成功并将 32
字节读入 buffer
,则 10
字节仍可用于从 socket
读取。 op 1
的完成处理程序将排队等待将来调用,error_code
为成功,bytes_transferred
为 32
。此时,socket.cancel()
对op 1
没有影响。启动 op 2
后,10
剩余字节准备好进入 buffer
,覆盖 op 1 中的一些未处理数据
。 op 2
的完成处理程序将排队等待将来调用,error_code
为成功,bytes_transferred
为 10
.
对于非组合操作,例如socket.async_read_some()
:
error_code
不会是boost::system::errc::success
和bytes_transferred
永远是 0
error_code
将是 boost::system::errc::success
而 bytes_transferred
将更大小于或等于 0
此行为记录在 StreamSocketService 中的 async_receive()
和 async_send()
函数:
If the operation completes successfully, the [handler] is invoked with the number of bytes transferred. Otherwise it is invoked with
0
.
另一方面,使用组合操作,例如 boost::asio::async_read()
,可以使用非成功的 error_code
和非零的 bytes_transferred
调用处理程序。例如,如果启动 async_read()
操作并设置为在完成之前读取 1024 个字节,则它可能会多次调用 async_read_some()
。如果收到 256 个字节然后连接关闭,async_read()
处理程序将有一个非零的 error_code
并且 bytes_transferred
将指示缓冲区的 256 个字节是有效的。
关于c++ - asio : is it safe to restart a async_read_some/async_write_some after cancel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36334161/
我偶然发现了 Wikipedia 上的线程安全文章;它区分了几个安全级别,尤其是: Thread safe: Implementation is guaranteed to be free of ra
当我启动 Rails 时,如何摆脱这个警告/错误。 在没有 :safe 选项的情况下调用“加载”——默认为安全模式。 => Booting Thin => Rails 3.2.13 applicati
当我启动 Rails 时,如何摆脱这个警告/错误。 在没有 :safe 选项的情况下调用“加载”——默认为安全模式。 => Booting Thin => Rails 3.2.13 applicati
我正在尝试使用 FCM 和 https://www.simplifiedcoding.net/firebase-cloud-messaging-android/ 上提供的教程向我的应用程序添加通知服务
我正在 VB.net 中寻找“安全”点符号。这样的事情是否存在——在 VB.NET 或任何语言中?我希望能够做的是,在使用 non-nullable 遗留对象时,解决如下问题: “如果有计划,如果有案
我在我的机器上使用 Windows 10 家庭单语言版,这是一个 64 位操作系统。 我已经安装了最新版本的 XAMPP,它在我的机器上安装了 PHP 7.2.7。 我是根据摘自 PHP Manual
我在 XmlDocument class documentation 中看到在 MSDN 上 Any public static ( Shared in Visual Basic) members o
例如,我经常想用 SELECT whatever FROM questions WHERE views * N + votes * M > answers AND NOT(answered) O
在DataStax收购Aurelius之后,自从Titan 1.0.0在2015年9月发布以来,自那时以来几乎没有提交过,所以我想知道在生产中使用TitanDB是否安全。谁能给我一些见识? 最佳答案
给定一个文件: dept4.abc.edu dept3.abc.edu dept2.abc.edu dept1.abc.edu 我知道如何使用以下命令获取从底部开始的第三行: tail -3 file
SELECT TO_NUMBER('*') FROM DUAL 这显然给了我一个异常(exception): ORA-01722: invalid number 有没有办法“跳过”它并获取 0 或 N
我不是在问这些是否真的是随机的。我只是想知道如果两个用户同时点击一个页面他们可以获得相同的随机数吗?我在想,如果我在多核服务器上运行它,我会因为同步或其他原因在很长一段时间内生成相同的随机数吗? pu
我有一个服务器存储来自客户端的数据。每个客户端都在自己的线程中工作,并且拥有一个数据对象。 这个数据对象是一个自定义类,让我们调用包含非特定数据的 Data.java,这可能是一些字节,但通常约为 1
我正在开发一个应用程序,其中我有一个包含 5000 行和 4 列的数据库。 problem_id (int) problem_no (string) problem_title (string) da
我有一个表,其中每行的字段数据都不完整,我想要修复。 这就是我的意思: mysql> CREATE TABLE test ( key INT a CHAR(1),
这个问题已经有答案了: How do JavaScript closures work? (86 个回答) 已关闭 6 年前。 所以,这个代码片段工作起来非常方便,但我对它的工作方式感到有点惊讶。 v
我想 compile C++ extensions to SQL Server , 来自文档 Safe mode: Run verifiably typesafe code; compiled wit
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。为了帮助澄清这个问题以便它可以重新打开,visit the help center。 关
这种互斥模式是否像我认为的那样安全?如果是这样,你怎么调用它? lock (_lock) { if (_flag) return; else _flag = true; } try {
假设您使用 EntityFramework 作为 ORM,所有这些都封装在一个单独的 DAL 类库中。 您在另一个“公共(public)”类库中有以下 POCO 对象,它在您的 DAL、SL 和表示层
我是一名优秀的程序员,十分优秀!