Как начать более одного потока в 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, и все они добавлены.

Другие вопросы по тегам