我正在审查Boost网站上的HTTP Server 3示例.
你能解释我为什么需要strand每个连接吗?正如我所看到的,我们read_some只在read-event的处理程序中调用.所以基本上read_some调用是顺序的,因此不需要strand(第3段的第2项说同样的事情).多线程环境中的风险在哪里?
我已经开始使用Boost.ASIO进行一些简单的网络编程,我对图书馆的理解不是很多,所以请耐心等待我和我的新手问题.
在我的项目中,我只有一个io_service对象.哪个用于所有异步I/O操作等.
我的理解是,可以创建多个线程并将io_service实例的run方法传递给线程,以便为该线程提供更多线程io_service.
我的问题:拥有多个io_service物体是好的设计吗?比方说,例如有2个不同的io_service实例,每个实例有2个线程相关联,它们是否以某种方式相互了解(因此与每个实体合作),或者如果不是,它们会相互产生负面影响吗?
我的目的是io_service为基于套接字的I/O 提供1,为基于串行(tty)的I/O提供另一个.
我想开发一个服务器使用多个线程和多个io_service实例(每个线程使用一个io_service实例)来监听端口.对于每个io_service实例,我创建了一个相应的boost :: asio :: ip :: tcp :: acceptor对象.我试试这段代码:
using namespace boost::asio;
...
io_service io_service_;
io_service io_service_1;
ip::tcp::acceptor* acceptor_;
acceptor_ = new ip::tcp::acceptor(io_service_);
ip::tcp::endpoint ep( ip::tcp::v4(), LISTEN_PORT);
acceptor_->open(ep.protocol());
acceptor_->bind(ep);
acceptor_->listen();
ip::tcp::acceptor* acceptor_1;
acceptor_1 = new ip::tcp::acceptor(io_service_1);
acceptor_1->open(ep.protocol());
acceptor_1->bind(ep);
acceptor_1->listen();
...
boost::thread th( boost::bind(&io_service::run, &io_service_));
boost::thread th( boost::bind(&io_service::run, &io_service_1));
...
Run Code Online (Sandbox Code Playgroud)
运行时会显示错误对话框:
boost :: exception_detail :: clone_impl <boost :: exception_detail :: error_info_injector>在内存位置0x001FF704.
你能帮助我如何使用多个线程制作服务器,每个线程使用一个io_service实例吗?
更新:正如我在Boost.Asio C++网络编程中所读到的,有3种方法可以使用带线程的io_service:
我可以实现案例1和2.但是对于案例3,我不知道如何实现它来处理许多并发连接,我应该使用1个线程来处理1个io_service(如上所述)?案例3是否具有比案例2更好的性能(可以处理更多并发连接)?
boost::asio::io_service::run()boost::system::system_error如果出错,则抛出异常.我应该处理这个例外吗?如果是这样,怎么样?
我的main.cpp代码是这样的:
main()
{
boost::asio::io_service queue;
boost::asio::io_service::work work(queue);
{
// set some handlers...
**queue.run();**
}
// join some workers...
return 0;
}
Run Code Online (Sandbox Code Playgroud)