微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C ++:Boost io_context / strand wrap导致shared_ptr上的段错误

如何解决C ++:Boost io_context / strand wrap导致shared_ptr上的段错误

有人可以帮助我理解为什么我从代码片段中得到以下结果吗?如果将lambda函数更改为至少包含1个参数:我两次获得了“ valid ptr”输出。这是在我的代码中发生的段错误崩溃中发现的。

Output:
  valid ptr
  nullptr

#include <iostream>
#include <memory>
#include <boost/asio.hpp>

auto getWrapper(boost::asio::io_context& ioContext) 
{
    auto sharedPtr = std::make_shared<int>(0);
    return ioContext.wrap( [sharedPtr](){ 
                                          if(sharedPtr == nullptr) 
                                            std::cout << "nullptr\n";
                                          else
                                            std::cout << "valid ptr\n";
                                         });
}

int main()
{
    boost::asio::io_context ioContext;
    auto wrapper = getWrapper(ioContext);
    wrapper();
    wrapper();
    ioContext.run();
}

解决方法

首先,您必须实际使用绞线,并且不赞成使用io_context::wrap。 所以让我们写

#include <iostream>
#include <memory>
#include <boost/asio.hpp>

auto getScheduleWrapper(boost::asio::io_context::strand& strand)
{
    auto sharedPtr = std::make_shared<int>(0);
    return [sharedPtr,&strand] () {
    boost::asio::post(strand.context(),boost::asio::bind_executor(strand,[sharedPtr] (){
                          if(sharedPtr == nullptr)
                              std::cout << "nullptr\n";
                          else
                              std::cout << "valid ptr\n";
                      }));
        };
}

int main()
{
    boost::asio::io_context ioContext;
    boost::asio::io_context::strand strand{ioContext};
    auto scheduleWrapper = getScheduleWrapper(strand);
    scheduleWrapper();
    scheduleWrapper();

    ioContext.run();
}

这将输出

valid ptr
valid ptr

符合预期。但请注意:线程并不能保证计划的任务将运行一次,而实际上您是在计划两次。它们是“唯一的”保证在该分支上一次只能运行一个任务,并且将按照最初计划的顺序运行。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?