-2

クラスに次のメソッドがあります

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++ アプリケーションで不確定な数のスレッドを実行するにはどうすればよいかということです。

4

1 に答える 1

0

これを行う方法は、最初にベクトル内のすべてのリスナー インスタンスを収集することです。次に、このベクトルをループして、実際のスレッドで別のベクトルを作成します。

// 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();
}

各スレッドの最後に while(true) があるので、アプリケーションは必要なすべてのドメインをリッスンしながら実行を続けます。

lvector は for ループの外にある必要があり、それらはすべて追加されるため、スコープに問題があると思います。

于 2015-04-05T19:39:19.833 に答える