【问题标题】:Identify objects in boost::shared_ptr<boost::thread>识别 boost::shared_ptr<boost::thread> 中的对象
【发布时间】:2023-03-07 23:16:01
【问题描述】:

我正在根据 boost 网站上的示例构建应用程序。以下是需要了解的相关定义:

typedef boost::shared_ptr连接_ptr; std::setconnections_; std::vector&lt boost::shared_ptr&lt boost::thread&gt &gt 线程;

connection 是一个类。

在其中一个文件connection_manager.cpp 中,他们这样做:

无效 connection_manager::start(connection_ptr c) { 连接_.插入(c); c->开始(); }

现在,由于我的程序结构,我想在单独的线程中启动每个新连接。所以我根据上面的修改:

无效 connection_manager::start(connection_ptr c) { boost::shared_ptr&lt boost::thread &gt thread(新的 boost::thread( boost::bind(&connection::start, c))); // 将新创建的线程推入向量中 线程.push_back(线程); // 将连接保存在我们的集合中 连接_.插入(c); }

我的问题,因此这个问题,是当我只想这些 connection_ 对象之一。在前面提供的链接中,他们这样做:

无效 connection_manager::stop(connection_ptr c) { 连接_.erase(c); c->停止(); // 找到线程之间的连接并加入该线程 }

但正如上面的评论所暗示的,我如何在所有线程中找到 c 并仅停止该线程。我想为该线程调用 join() 函数。


更新:

我认为这实际上是我真正想要的!所以我将我的变量声明为

std::map &lt connection_ptr, boost::shared_ptr &lt boost::thread &gt &gt 线程;

但是,如何像以前一样创建新胎面?喜欢:

boost::shared_ptr &lt boost::thread &gt thread(新的 boost::thread( boost::bind(&connection::start, c)));

但是下一步是什么?很抱歉让您感到困惑... :-)

【问题讨论】:

    标签: c++ boost threadpool boost-thread boost-bind


    【解决方案1】:

    如果您使用地图(或其他关联容器)而不是矢量,您可以保持连接和线程之间的关联:

    std::map<connection_ptr, boost::shared_ptr<boost::thread> > threads;
    

    允许你写:

    threads[connection] = thread;
    

    而不是创建线程后的 push_back 调用,然后:

    threads[connection]->stop();
    

    稍后当您想查找时。

    注意:一般来说,在线程和网络连接之间保持 1:1 映射的应用程序很容易受到拒绝服务 (DoS) 攻击。

    【讨论】:

    • 只是为了让我理解你是正确的:有一张地图作为你的目的,那是不是很容易受到攻击?我该怎么做呢?
    • 问题是邪恶的人很容易编写一个每秒连接到您的应用程序 100 次的程序。就每个线程所需的 RAM 和 CPU 时间而言,创建线程相当昂贵。如果这些连接中的每一个都创建一个新线程(然后可能将其进一步绑定),那么系统的性能将逐渐停止。正常的解决方案是使用thread pool 创建最多固定数量的线程,然后在多个连接之间共享每个线程。
    • 我正在努力解决这个问题,感谢您的帮助。您说的“在多个连接之间共享每个线程”是否意味着类似HTTP Server 2 Example。 io_services 在不同的线程中创建。然后,新连接将使用其中之一。你是这个意思吗?程序流在不同线程中拥有 io 服务意味着什么?那(例如 async_read() 的回调)也可以在不同的线程中执行?
    • 这看起来像我建议的那种事情。 (我认为使用 ASIO 可能有更好的方法来做到这一点,但我不记得了)。基本上发生的情况是对于池大小>连接数的少量连接,所以你基本上得到了 1:1 的连接:线程比率。随着连接数量的增加,尽管您开始有多个连接由一个线程提供服务,但这种情况的性能往往会在负载下更优雅地下降。
    • 好的,我明白了,谢谢!但是,为了有更好的表现,你建议我怎么做?我对这个性能/线程的东西相当陌生,那么我可以在 HTTP Server 2 示例中进行任何更改以获得更好的性能吗?
    【解决方案2】:

    如果您的连接总是绑定到一个线程,那么简单地让连接对象指向它正在运行的线程并将在线程中启动的逻辑移动到连接类本身是有意义的。

    【讨论】:

      猜你喜欢
      • 2012-07-21
      • 1970-01-01
      • 2013-04-16
      • 2011-04-19
      • 1970-01-01
      • 2015-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多