如何在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 ++应用程序中运行不确定数量的线程。

保罗·查普曼

实现此目的的方法是首先将所有侦听器实例收集到一个向量中。然后遍历此向量,使用实际线程创建另一个向量。

// 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循环之外,并且它们都已添加。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在一次调用C ++ 11中启动多个线程

来自分类Dev

c# 如何在多个线程中更新多个表单?

来自分类Dev

如何在BackgroundWorker中启动线程?

来自分类Dev

如何在Python中同时启动线程

来自分类Dev

Python - 如何在构建线程步骤中不启动线程

来自分类Dev

如何在多个线程中运行 webviews

来自分类Dev

如何启动多个线程,每个线程在不同的文件上工作?

来自分类Dev

如何在Android中为多个线程使用多个按钮?

来自分类Dev

在C中创建多个线程

来自分类Dev

如何在程序启动时启动C ++线程?

来自分类Dev

如何在程序启动时启动C ++线程?

来自分类Dev

如何在Qt中重新启动线程?

来自分类Dev

如何在片段中启动计时器的新线程

来自分类Dev

如何仅在Perl中按需启动线程?

来自分类Dev

如何仅在Perl中按需启动线程?

来自分类Dev

C#中的多线程无法启动

来自分类Dev

如何在C ++中设置线程数

来自分类Dev

如何在C#中停止线程

来自分类Dev

如何在 C# 中异步生成多个线程以多次调用一个方法?

来自分类Dev

如何在不同的线程中同时运行多个QDialogs?

来自分类Dev

我们如何在Java中调用多个线程?

来自分类Dev

如何在多个线程中收集方法的返回值

来自分类Dev

如何在给定的MPI进程中运行多个线程?

来自分类Dev

Javascript:如何在JavaScript中实现多个线程?

来自分类Dev

我们如何在Java中调用多个线程?

来自分类Dev

C#:如何在特定时间启动线程

来自分类Dev

在python中启动多个线程

来自分类Dev

如何在mvvm / wpf中的应用程序启动时启动bg线程?

来自分类Dev

如何在CMD中对多个命令使用启动