C++ 升压ASIO插槽io_服务。运行阻塞

C++ 升压ASIO插槽io_服务。运行阻塞,c++,sockets,boost,boost-asio,C++,Sockets,Boost,Boost Asio,在我开始之前,我只是想尝试一下。我还不知道我是否想做一个大项目 我试着用Boost制作一个TCP套接字服务器,因为它比winsock容易得多。至少,我是这么想的,但这并不能满足我的需要。应该发生什么: 读取配置 启动TCP套接字服务器 运行_acceptor.async_accept 运行io_服务。运行 现在,我的套接字服务器可以工作并接受连接。但是,我无法再进行用户输入,因为io\u服务。run会阻塞服务器的其余部分。我一定是做错了什么 tcp_listener.h: #pragma onc

在我开始之前,我只是想尝试一下。我还不知道我是否想做一个大项目

我试着用Boost制作一个TCP套接字服务器,因为它比winsock容易得多。至少,我是这么想的,但这并不能满足我的需要。应该发生什么:

  • 读取配置
  • 启动TCP套接字服务器
  • 运行_acceptor.async_accept
  • 运行io_服务。运行
  • 现在,我的套接字服务器可以工作并接受连接。但是,我无法再进行用户输入,因为
    io\u服务。run
    会阻塞服务器的其余部分。我一定是做错了什么

    tcp_listener.h:

    #pragma once
    #include <boost/asio.hpp>
    class tcp_listener
    {
    public:
        tcp_listener(boost::asio::io_service& io_service, std::string ip, short port);
        static void start(tcp_listener* ptr);
        void start_accepting();
    private:
        boost::asio::ip::tcp::acceptor _acceptor;
        boost::asio::ip::tcp::socket _socket;
    };
    
    engine.cpp:

    #include "engine.h"
    #include "tcp_listener.h"
    #include <boost/thread.hpp>
    #include <boost/bind.hpp>
    configuration* engine::config;
    void engine::boot()
    {
        engine::config = new configuration("config.cnf");
    
        boost::asio::io_service io_service;
        tcp_listener& list = tcp_listener(io_service, engine::config->get_value("network.ip"), atoi(engine::config->get_value("network.port").data()));
    }
    
    void engine::destroy()
    {
        delete engine::config;
    }
    
    configuration* engine::get_config()
    {
        return engine::config;
    }
    
    #包括“engine.h”
    #包括“tcp_listener.h”
    #包括
    #包括
    配置*引擎::配置;
    void引擎::boot()
    {
    引擎::配置=新配置(“config.cnf”);
    boost::asio::io_服务io_服务;
    tcp_listener&list=tcp_监听器(io_服务,引擎::config->get_值(“network.ip”)、atoi(引擎::config->get_值(“network.port”).data());
    }
    void引擎::destroy()
    {
    删除引擎::配置;
    }
    配置*引擎::获取配置()
    {
    返回引擎::config;
    }
    
    Main.cpp:

    #include "engine.h"
    #include <iostream>
    
    int main()
    {
        engine::boot();
    
        for (;;)
        {
            std::string input;
            std::cin >> input;
    
            if (input == "exit")
            {
                engine::destroy();
    
                break;
            }
        }
    
        return 0;
    }
    
    #包括“engine.h”
    #包括
    int main()
    {
    引擎::boot();
    对于(;;)
    {
    std::字符串输入;
    std::cin>>输入;
    如果(输入=“退出”)
    {
    引擎::destroy();
    打破
    }
    }
    返回0;
    }
    
    我已经搜索了5个多小时,我尝试了一百万件事情,但都没有成功。我试着把它放在一个线程中,结果出现了一个异常。或者套接字服务器本身不工作

    用户输入有助于重新加载某些缓存数据或关闭应用程序或类似的操作。

    这是出于设计

    只需在单独的线程上运行服务

     std::thread th([&] { io_service.run(); }); // example
    
    当心共享资源上的线程同步

    io_服务
    是线程安全的(特殊操作除外,如构造、销毁、重置)。因此,如果您必须执行需要同步的任务,则最简单的方法是
    post()
    将其发送到
    服务

    只要您只有一个线程运行特定的
    io_服务
    实例,就不需要额外的同步(即所谓的逻辑或隐式串)


    如果我这样做,我会得到一个调试错误。我现在有:
    std::thread th([&]{io_service.run();})th.detach()
    ,但它给出了错误。如果没有分离,我也会得到错误。真正地如果您不确定如何在c++11中使用线程(这就是为什么我有
    //示例
    注释,您必须完成注释),那么
    std::thread
    的文档将很有帮助。我不是通灵者。很可能是在向服务添加工作之前启动线程,或者在生命周期结束之前忘记加入线程。或者两者兼而有之。你可以用任何你喜欢的方式开始一个线程。有很多。大多数Boost Asio示例都展示了如何实现这一点。
    #include "engine.h"
    #include <iostream>
    
    int main()
    {
        engine::boot();
    
        for (;;)
        {
            std::string input;
            std::cin >> input;
    
            if (input == "exit")
            {
                engine::destroy();
    
                break;
            }
        }
    
        return 0;
    }
    
     std::thread th([&] { io_service.run(); }); // example