如何解决为什么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 举报,一经查实,本站将立刻删除。