C++ 在boost::shared_ptr<;中识别对象;boost::线程>;

C++ 在boost::shared_ptr<;中识别对象;boost::线程>;,c++,boost,threadpool,boost-thread,boost-bind,C++,Boost,Threadpool,Boost Thread,Boost Bind,我正在基于boost网站上的一个示例构建一个应用程序。以下是需要了解的相关定义: typedef boost::shared_ptr< connection > connection_ptr; std::set< connection_ptr> connections_; std::vector< boost::shared_ptr< boost::thread> > threads; typedef boost::共享\u ptr< connection&g

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

typedef boost::shared_ptr< connection > connection_ptr; std::set< connection_ptr> connections_; std::vector< boost::shared_ptr< boost::thread> > threads; typedef boost::共享\u ptr< connection> connection\u ptr; 标准::设置<连接\u ptr>连接\u; std::vector< boost::shared_ptr< boost::thread>> threads; 其中连接是一个类

在其中一个文件中,它们是这样做的:

void connection_manager::start(connection_ptr c) { connections_.insert(c); c->start(); } void connection_manager::stop(connection_ptr c) { connections_.erase(c); c->stop(); // find the connection in among the threads and join that thread } 无效连接\u管理器::启动(连接\u ptr c) { 连接插入(c); c->start(); } 现在,由于我的程序结构,我想在一个单独的线程中启动每个新连接。因此,我根据以下内容对上述内容进行了修改:

void connection_manager::start(connection_ptr c) { boost::shared_ptr< boost::thread > thread(new boost::thread( boost::bind(&connection::start, c))); // push the newely created thread into the vector threads.push_back(thread); // save the connection in our set connections_.insert(c); } 无效连接\u管理器::启动(连接\u ptr c) { boost::shared_ptr< boost::thread> thread(新的boost::thread)( boost::bind(&connection::start,c)); //将新创建的线程推入向量 螺纹。推回(螺纹); //将连接保存在我们的集合中 连接插入(c); } 我的问题,也就是这个问题,是当我只想要这些连接对象中的一个时。在前面提供的链接中,他们是这样做的:

void connection_manager::start(connection_ptr c) { connections_.insert(c); c->start(); } void connection_manager::stop(connection_ptr c) { connections_.erase(c); c->stop(); // find the connection in among the threads and join that thread } 无效连接\u管理器::停止(连接\u ptr c) { 连接擦除(c); c->stop(); //在线程之间找到连接并连接该线程 } 但正如上面的评论所暗示的,我如何在所有线程中找到c并只停止该线程。我想为该线程调用join()函数


更新:

我想这才是我真正想要的!所以我声明我的变量为

std::map < connection_ptr, boost::shared_ptr < boost::thread > > threads; 标准::映射<连接&u ptr,boost::共享&u ptr< boost::线程>>线程; 但是,我如何创建一个新的胎面,和以前一样?比如:

boost::shared_ptr < boost::thread > thread(new boost::thread( boost::bind(&connection::start, c))); boost::shared_ptr< boost::thread> thread(新的boost::thread)( boost::bind(&connection::start,c)); 但下一步是什么?对不起,我弄糊涂了…:-)

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

std::map<connection_ptr, boost::shared_ptr<boost::thread> > threads;
而不是创建线程后的push_-back调用,然后:

threads[connection]->stop();
以后你想查的时候


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

如果您的连接总是绑定到线程,让connection对象指向它正在运行的线程,并将从线程开始的逻辑移动到connection类本身,这是有意义的。

我理解你的意思是正确的:有一个映射作为你的目标,这是不是很容易受到攻击?我该怎么做呢?问题是,对于一个邪恶的人来说,编写一个每秒连接到你的应用程序100次的程序是非常容易的。就每个线程所需的RAM和CPU时间而言,创建线程是相当昂贵的。如果这些连接中的每一个都创建了一个新线程(然后可能将其进一步绑定),那么系统的性能将逐渐停止。通常的解决方案是使用创建固定数量的线程,然后在多个连接之间共享每个线程。我正在尝试解决这个问题,谢谢您的帮助。“在多个连接之间共享每个线程”你说,这是否意味着类似于。io_服务是在不同的线程中创建的。然后,新连接将使用其中一个。这就是你的意思吗?对于程序流来说,在不同线程中使用io服务意味着什么?那么,也可以在不同的线程中执行(例如async_read()的回调)吗?这看起来就像我建议的那样。(我想ASIO可能有更好的方法,但我记不清了)。基本上,对于少量连接,池的大小>连接的数量,因此基本上可以得到1:1的连接:线程比率。随着连接数的增加,虽然您开始有多个连接由一个线程提供服务,但在负载下,这一功能的性能往往会更优雅地降低。好的,我明白了,谢谢!但是,为了有更好的表现,你会建议我怎么做?我对这个性能/线程方面的东西还比较陌生,所以在HTTPServer2示例中有什么我可以更改的地方来获得更好的性能吗?