Странная проблема многопоточности

У меня есть конструктор, который создает два потока сервера (я использую библиотеку cpp-netlib). Странная проблема, которую я получаю, заключается в том, что, хотя я не вызываю servlet1.join () и servlet2.join () в конструкторе, по какой-то причине конструктор ожидает завершения двух потоков. Хотя эти темы никогда не закончатся. Однако, если я добавлю один и тот же код в main (), он не будет ждать двух потоков, пока я не вызову join (). Посмотрите на версии 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;
}

0

Решение

У вас есть бесконечный цикл, потому что вы создаете экземпляр Server в конструкторе Server ()

в-

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;
}
2

Другие решения

Других решений пока нет …