0

サーバーの2つのスレッドを作成するコンストラクターがあります(cpp-netlibライブラリーを使用しています)。私が得ている奇妙な問題は、コンストラクターでservlet1.join()とservlet2.join()を呼び出さなくても、何らかの理由でコンストラクターが2つのスレッドが終了するのを待つことです。これらのスレッドは決して終了しませんが。ただし、同じコードをmain()に配置すると、join()を呼び出さない限り、2つのスレッドを待機しません。バージョンAとBを見てください。

http_server * serv;

A-

Server()
{
    boost::network::utils::thread_pool thread_pool(2);
    Server handler();
    serv = new http_server(0.0.0, 800, handler, thread_pool);
    boost::thread servlet1(boost::bind(&http_server::run, serv));
    boost::thread servlet2(boost::bind(&http_server::run, serv));
    serv->run();
    std::cout << "This never prints" << std::endl;
}
~Server()
{
    serv->stop(); //this kills all threads and stops server gracefully
    delete serv;
}

主要:

int main()
{
    std::cout << "hi" << std::endl; //this prints
    Server* test = new Server();
    std::cout << "hi" << std::endl; //this never prints
    delete test;
}

B-

int main()
{
    boost::network::utils::thread_pool thread_pool(2);
    Server handler();
    serv = new http_server(0.0.0, 800, handler, thread_pool);
    boost::thread servlet1(boost::bind(&http_server::run, serv));
    boost::thread servlet2(boost::bind(&http_server::run, serv));
    serv->run();
    std::cout << "This always prints" << std::endl;
}
4

1 に答える 1

2

Server()コンストラクターでサーバーをインスタンス化しているため、無限ループが発生します

Aで-

Server()
{
    boost::network::utils::thread_pool thread_pool(2);

    ***--> Server handler(); <--***

    serv = new http_server(0.0.0, 800, handler, thread_pool);
    boost::thread servlet1(boost::bind(&http_server::run, serv));
    boost::thread servlet2(boost::bind(&http_server::run, serv));
    serv->run();
    std::cout << "This never prints" << std::endl;
}
于 2013-02-21T19:56:17.410 に答える