2

我正在基于 boost 网站上的示例构建应用程序。这些是需要了解的相关定义:

typedef boost::shared_ptr<connection>connection_ptr;
std::set<connection_ptr> 连接_;
std::vector< boost::shared_ptr< boost::thread>> 线程;

连接是一个类。

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

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

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

无效 connection_manager::start(connection_ptr c)
{
    boost::shared_ptr< boost::thread > 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 < connection_ptr, boost::shared_ptr < boost::thread >> 线程;

但是,我如何创建一个新的胎面,就像以前一样?像:

boost::shared_ptr < boost::thread > thread(新的 boost::thread(
                        boost::bind(&connection::start, c)));

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

4

2 回答 2

2

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

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

允许您编写:

threads[connection] = thread;

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

threads[connection]->stop();

稍后当您想要查找它时。

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

于 2011-05-13T11:10:43.533 回答
1

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

于 2011-05-13T11:28:03.923 回答