使用boost套接字,我只需要一个io_service吗?

时间:2010-11-02 14:08:44

标签: c++ sockets boost boost-asio

在几个不同的线程中有几个连接..我基本上做了一个使用boost / asio.hpp和tcp东西的基类。 现在我正在读这个:http://www.boost.org/doc/libs/1_44_0/doc/html/boost_asio/tutorial/tutdaytime1.html 它说“所有使用asio的程序都需要至少有一个io_service对象。” 所以我的基类应该有一个静态的io_service(这意味着所有程序只有1个,所有不同的线程和连接将使用相同的io_service对象) 或者使每个连接成为自己的io_service?

在前面谢谢!

更新: 好吧基本上我想做的是一个基本客户端的类,它将有一个套接字。 对于每个套接字,我将拥有一个始终接收的线程和一个有时发送数据包的不同线程。 在这里查看之后:www.boost.org/doc/libs/1_44_0/doc/html/boost_asio/reference/ip__tcp/socket.html(因为我刚刚在这里做了超链接所以..所以每篇文章只有1个)我能看到那个socket类不是完全线程安全的..

所以有2个问题: 1.基于我刚刚编写的设计,我是否需要为所有套接字提供1个io_service(意味着使其成为静态类成员)或者每个应该有一个? 2.如何使其成为线程安全的?我应该把它放在一个“线程安全的环境”中,这意味着制作一个新的套接字类,它具有互斥量和不允许你同时发送和接收的东西,或者你有其他建议吗? 也许我应该继续进行异步设计? (ofc每个套接字都有不同的线程,但发送和接收将在同一个线程上?)

只是为了澄清:我正在做一个连接到很多服务器的tcp客户端。

3 个答案:

答案 0 :(得分:11)

答案 1 :(得分:5)

对于异步操作,您应该为整个程序使用单个io_service对象。无论是类的静态成员,还是在其他地方实例化都取决于您。多个线程可以调用其run方法,这在Inverse's answer.

中有所描述
  

多个线程可能会调用   io_service :: run()来建立一个池   完成处理程序的线程   可以被调用。这种方法也可能   与io_service :: post()一起使用   一种执行任何计算的方法   跨线程池的任务。

     

请注意已加入的所有线程   考虑一个io_service的池   等价的,io_service可以   在他们中间分配工作   任意时尚。

如果您的处理程序不是线程安全的,请阅读strands

  

一条链被严格定义   顺序调用事件   处理程序(即没有并发   调用)。使用股线允许   在多线程中执行代码   程序无需显式   锁定(例如使用互斥锁)。

答案 2 :(得分:1)

io_service调用连接的所有处理函数。所以你应该有一个运行线程,以便跨线程分配工作。这是一个页面解释io_service和线程:

Threads and Boost.Asio