宅の士
宅の士
析构会崩问题同源,就像之前那个onClose析构后触发会崩溃的优化提交和你这个例子会析构后触发startRecv崩溃,本质上都是同一个原因,只要用到外部loop内部的停止逻辑都不会等待终止线程,所以你只要出现析构后loop触发了什么事件回调在回调处理中又用到被释放的对象成员数据就会崩溃。但并不是百分百触发,有时候会因为运行环境的不同对象释放后内存被填充成0导致某些异步回调触发判断是否为空条件成立从而避免崩溃。
> 这个感觉没太大必要,理解成本也高,想关闭连接可直接调用ctx->writer->close(),不想响应非http报文,也可以直接通过ctx->writer->write()发送任意的数据 你说的这个方式起初我就尝试过了存在缺陷后才支持的返回WANT_CLOSE方案 因为 ctx->writer->close 必须使用异步关闭,如果同步关闭会导致处理链后面的执行逻辑引用野指针崩溃,而异步虽然能关闭但存在延迟需要等待下一次loop事件关闭,另外你说的通过writer->write发送任意数据是可以但无法阻止默认处理链的发送HTTP响应头信息,而SendHttpStatusResponse函数 if (HandleHttpRequest() == HTTP_STATUS_NEXT) return 0; 这一行修改就为了修复 ctx->writer->state = hv::HttpResponseWriter::SEND_END; 阻止响应HTTP头无效的问题,因为SendHttpStatusResponse中调用 HandleHttpRequest() 与 onMessageComplete函数中调用 HandleHttpRequest() 因缺少 if (status_code != HTTP_STATUS_NEXT) SendHttpResponse(); 造成行为不一致导致有些情况能阻止响应有些情况不行,还有if (error ==...
@ithewei Channel默认的close 就是async=false 同步方式 在Http处理链回调使用会崩溃反而会增加理解使用成本