为什么boost在这种情况下不创建线程(C2248),以及如何创建它
Why boost does not create a thread in such case (C2248) and how to create it?
所以我有这样的代码:
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" boostasiobasic_io_object.hpp 93
如何使它有可能运行我的request_response_loop函数在另一个线程,我使用套接字接受?
进一步解释Ben的回答,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
函数不会等待,因此一旦套接字超出作用域,它就会销毁套接字。
对于线程间传递的变量,你需要使用动态或静态生命周期,而不是自动的。
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 使用std::multimap迭代器创建std::list
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 如何为使用创建窗口创建的窗口创建自定义背景颜色
- glfw 在创建之前/创建时实例化窗口位置
- 如何使用创建类创建类方法
- 是否可以从创建其创建的Main()之外的公共类成员访问公共类成员
- 是否可以在C++中声明基类,以便只能通过创建函数创建从它派生的类
- 我可以使用自定义样板模板创建QT创建项目
- 如何为创建循环创建新样式
- 从创建进程创建的进程获取输出
- 无法访问创建目录创建的目录
- 用于C++对象持久性的ORM ODB是否创建/重新创建DB
- 创建动态数组后,"i"变量不知从何而来
- 使用创建窗口创建 MDI 子窗口
- 如何创建用于创建html预览的样式表
- 如何将图像附加到使用Qt创建器创建的GUI
- 如何为不可创建类创建包装器
- 如何成功创建一个创建对象并返回指向该对象的指针的函数
- Mysql创建过程(创建语句)在qt