在几个不同的线程中有几个连接..我基本上做了一个使用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客户端。
答案 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和线程: