Почему boost не создает поток в таком случае (C2248) и как его создать? - PullRequest
1 голос
/ 14 апреля 2011

Итак, у меня есть такой код:

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 в другом потоке, который я используюсокет принимает?

Ответы [ 2 ]

3 голосов
/ 14 апреля 2011

Чтобы расширить ответ Бена, 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;
        }
    }
}
2 голосов
/ 14 апреля 2011

В следующий раз покажите все сообщение об ошибке.

Ваша проблема в том, что процедура вашего потока хочет ссылку на сокет, но сокет является локальной переменной.Функция acceptor_loop не ждет, поэтому она разрушит сокет, как только выйдет из области видимости.

Вам необходимо использовать динамическое или статическое время жизни, а не автоматическое, для переменных, передаваемых между потоками.

...