Как начать более одного потока в C++
У меня есть следующий метод в классе
void Listener::Start()
{
Logger logger;
std::string logMessage("Starting '" + to_utf8string(GetName()) + "' Listener");
http_listener httpListener(GetUri());
std::string listenerName(to_utf8string(name));
logger.log(logMessage);
// listener recieves a GET request.
httpListener.support(methods::GET, [listenerName](http_request request)
{
Logger logger;
std::string logMessage("GET request recieved from " + listenerName);
logger.log(logMessage);
// dummy line just till routing is dealt with
request.reply(status_codes::OK, logMessage);
});
// open listener and route request
httpListener
.open()
.then([&httpListener,listenerName](){
Logger logger;
std::string logMessage(listenerName + "started");
logger.log(logMessage);
}).wait();
// JUST WAIT - we do not want the application to stop
while (true);
}
Теперь я не знаю, сколько там потоков - это просто количество записей, прочитанных из таблицы базы данных.
for each (Listener l in ls.Select(m.GetId()))
{
l.Start();
}
Только первый поток запускается и запускается, что логично в том смысле, что единственное, что мешает потоку работать, - это постоянный цикл.
Однако, если это выполняется таким образом;
std::vector<thread> listener_threads;
for each (Listener l in ls.Select(m.GetId()))
{
listener_threads.push_back(thread{ &Listener::Start, &l });
}
Кажется, что ни один из потоков не работает - ни один из слушателей не отвечает ни на один запрос.
Поэтому вопрос заключается в том, как вы можете запустить неопределенное количество потоков в приложении C++.
1 ответ
Способ сделать это - сначала собрать все экземпляры слушателя в векторе. Затем выполните цикл по этому вектору, создав еще один вектор с реальными потоками.
// collect all the listeners into a vector
for (auto& m : rm.Select()) {
for (auto& l : ls.Select(m.GetId())) {
lvector.push_back(l);
}
}
// now create threads for each listener
for (auto& lstnr : lvector)
{
listener_threads.push_back(std::thread{ &Listener::Start, &lstnr });
}
// now join with this thread.
for (auto& t : listener_threads)
{
t.join();
}
Поскольку у меня есть некоторое время (true) в нижней части каждого потока - тогда приложение просто продолжает работать, прослушивая все необходимые домены.
Я думаю, что, возможно, проблема с областью видимости, поскольку lvector должен быть вне циклов for, и все они добавлены.