识别 boost::shared_ptr<boost::thread> 中的对象

Identify objects in boost::shared_ptr<boost::thread>

本文关键字:boost gt 对象 thread shared ptr 识别 lt      更新时间:2023-10-16

我正在根据boost网站上的一个例子构建一个应用程序。这些是需要了解的相关定义:

类型定义 提升::shared_ptr<连接> connection_ptr;标准::设置 connections_;std::vector<boost::shared_ptr><boost::thread>> threads;

其中连接是一个类。

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

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

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

无效 connection_manager::开始(connection_ptr c){    提升::shared_ptr<提升::线程> 线程(新提升::线程(                        boost::bind(&connection::start, c)));    将新创建的线程推入向量    threads.push_back(螺纹);    将连接保存在我们的集合中    connections_.插入(c);}

我的问题,因此这个问题,是当我只想connection_对象中的一个时。在前面提供的链接中,它们如下所示:

无效 connection_manager::停止(connection_ptr c){    connections_.擦除(c);    c->stop();    在线程中找到连接并加入该线程}

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


更新:

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

标准::映射 <connection_ptr,><提升::线程>> 线程;

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

提升::shared_ptr <提升::线程> 线程(新提升::线程(                        boost::bind(&connection::start, c)));

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

如果使用映射(或其他关联容器)而不是向量,则可以在连接和线程之间保持关联:

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

允许您编写:

threads[connection] = thread;

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

threads[connection]->stop();

稍后当您要查找它时。

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

如果您的连接始终绑定到线程,则只需让连接对象指向它正在运行的线程并将线程中启动的逻辑移动到连接类本身是有意义的。