为什么boost在这种情况下不创建线程C2248,以及如何创建它?

如何解决为什么boost在这种情况下不创建线程C2248,以及如何创建它?

| 所以我有这样的代码
using namespace boost::asio::ip;
using namespace std;

void request_response_loop(boost::asio::ip::tcp::socket& socket)
{
    HTTP_Request request(socket);
    http_response response;
    response.body = \"<head></head><body><h1>It Rocks!</h1></body>\";
    response.send(socket);
    socket.close();
    cout << \"connection resolved.\" << endl;
}


void acceptor_loop(){
    boost::asio::io_service io_service;
    int m_nPort = 12345;
    tcp::acceptor acceptor(io_service,tcp::endpoint(tcp::v4(),m_nPort));
    cout << \"Waiting for connection...\" << endl;
    while(true)
    {
        try
        {
            tcp::socket socket(io_service);
            acceptor.accept(socket);
            cout << \"connection accepted.\" << endl;
            boost::thread workerThread2(request_response_loop,socket); // here it does not compile because of C2248
        }
        catch(exception &e)
        {
            cerr << e.what() << endl; //\"The parameter is incorrect\" exception
        }
    }
}
int main()
{ 
    boost::thread workerThread(acceptor_loop);
    cin.get();
}
它给我错误
Error   1   error C2248: boost::noncopyable_::noncopyable::noncopyable: \"boost::noncopyable_::noncopyable\"  boost\\asio\\basic_io_object.hpp  93  
如何使我的request_response_loop函数在我用于套接字接受的另一个线程中运行?     

解决方法

为了扩大Ben \'s的答案,
boost::shared_ptr<>
是这里的常用机制:
void request_response_loop(boost::shared_ptr<tcp::socket> socket)
{
    http_request request(*socket);
    http_response response;
    response.body = \"<head></head><body><h1>It Rocks!</h1></body>\";
    response.send(*socket);
    socket->close();
    cout << \"connection resolved.\" << endl;
}

void acceptor_loop()
{
    boost::asio::io_service io_service;
    int m_nPort = 12345;
    tcp::acceptor acceptor(io_service,tcp::endpoint(tcp::v4(),m_nPort));
    cout << \"Waiting for connection...\" << endl;
    while(true)
    {
        try
        {
            boost::shared_ptr<tcp::socket> socket =
                boost::make_shared<tcp::socket>(boost::ref(io_service));
            acceptor.accept(*socket);
            cout << \"connection accepted.\" << endl;
            boost::thread workerThread2(request_response_loop,socket);
        }
        catch(exception &e)
        {
            cerr << e.what() << endl;
        }
    }
}
    ,下次显示整个错误消息。 您的问题是您的线程过程想要引用套接字,但是套接字是局部变量。
acceptor_loop
函数不会等待,因此一旦超出范围,它将立即销毁套接字。 您需要对线程之间传递的变量使用动态或静态生命周期,而永远不要使用自动生命周期。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 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”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?