gpt4 book ai didi

c++ - boost::asio::spawn 和 socket::async_receive_from 程序崩溃

转载 作者:行者123 更新时间:2023-11-28 04:31:28 25 4
gpt4 key购买 nike

int main() {
boost::asio::io_service io_service;

Worker ob1(&io_service);

ob1.AsyncRead();
io_service.run();

}

void Worker::AsyncRead() {
socket.async_receive_from(buffer,endpoint, handler);
}

void handler (const boost::system::error_code& error, size_t bytes_received) {
if(!error)
handleData();
AsyncRead();
}

现在一切正常。但是如果我使用 boost::Spawn() 来执行 asyncRead() 它会崩溃。

  void work(boost::asio::io_service* io_service) {

auto ob1 = std::make_shared<Worker>(io_service);
boost::asio::spawn(*io_service, [ob1](
boost::asio::yield_context yield) {

ob1->AsyncRead();

});

}

int main() {
boost::asio::io_service io_service;
work(&io_service);

io_service.run();

}

崩溃的堆栈跟踪是:

PC: @           0x4e3502 boost::asio::basic_io_object<>::get_service()
*** SIGSEGV (@0x18) received by PID 25135 (TID 0x7f6bde13b7c0) from PID 24; stack trace: ***
@ 0x7f6bdd37d390 (unknown)
@ 0x4e3502 boost::asio::basic_io_object<>::get_service()
@ 0x4e3074 boost::asio::basic_datagram_socket<>::async_receive_from<>()

我想让它与 boost::spawn() 一起工作。一旦我的 work() 返回,spawn() 会发生什么?

最佳答案

对于初学者来说,您的代码不可能编译(handler 必须是 Worker 的非静态成员函数,但这意味着它不满足处理程序要求async_receive_from

但是你问的问题看起来更简单:

 auto ob1 = std::make_shared<Worker>(io_service);

创建共享指针

 boost::asio::spawn(*io_service, [ob1](
boost::asio::yield_context yield) {

将一个 coro 发布到服务上,其中包含 ob1 的拷贝,因此它保持事件状态。到目前为止一切顺利。

  ob1->AsyncRead();

这执行了一个async_recieve_from,它自然会立即返回,coro 完成并释放ob1。但是 async_receive_from 仍在等待服务。

如果您想在 coro 中使用异步操作,则必须将 yield_context 作为完成标记传递。你没有那样做。

您的代码在概念上应如下所示:

  void work(boost::asio::io_service* io) {

boost::asio::spawn(*io_service, [io](boost::asio::yield_context yield) {

udp::socket socket(*io);
// ... more

udp::endpoint ep;
char buffer[1024];
socket.async_receive_from(buffer, ep, yield); // throws on error

});

关于c++ - boost::asio::spawn 和 socket::async_receive_from 程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52783731/

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