- 主题:boost asio容易误用的一个地方
咦?错在哪里?
【 在 z16166 的大作中提到: 】
: 错误写法
: class CMyClass
: {
: ...................
--
FROM 123.168.94.*
按理说不应该啊,m_io_context声明在先,所以到了m_timer的时候,m_io_context应该已经初始化了啊
【 在 z16166 的大作中提到: 】
: 成员按声明顺序初始化的,但我遇到m_timer初始化时m_io_context还是空的情况
:
--
FROM 123.168.94.*
enable shared from this的目的是防止async回调的时候,对象已经销毁了,所以用一个shared_ptr 捕获到回调的lamda里面,这样能保证回调执行的时候,对象依然还在
但是,从另一个线程去stop socket则是另外一码事,这样做的前提是所有的boost socket操作都是线程安全的,但是实际上这个没有明确保证,所以还是不建议从另一个线程去stop socket
【 在 ziqin 的大作中提到: 】
: 也不是不可以 直接外部stop socket就是硬刹车 里面所有未完成的任务直接按错误代码回呼
:
: 死机的最大可能是那个socket本身是个指针 stop以后就被释放了 然后所有callback里如果绑了socket的指针就都出问题了
: ...................
--
FROM 123.168.94.*
要我的话,我就把io_context::io_context()和io_context::~io_context()加上断点,然后看看崩的时候,到底是还没创建io_context,还是因为某种原因(也许其依附的对象不在了),io_context已经不在了
【 在 z16166 的大作中提到: 】
: 如果只是执行一个OS的socket句柄的关闭的话,还行。
: 复杂操作就不行了。
:
: ...................
--
FROM 123.168.94.*
boost的socket是封装过的对象,不是一个简单的fd,在不同线程对同一个对象操作,自然需要考虑是否线程安全
boost asio 1.78 chat_client. cpp里面关闭socket恰恰就是通过post lamda到io context进行的,也就是关闭操作是和读写操作在同一个线程,而不是直接跨线程执行关闭操作
【 在 ziqin 的大作中提到: 】
: socket是不是thread safe指socket上的io操作,比如能不能多个同时读取或者同时写入或者同时读写
:
: 但是shutdown这种操作不需要,socket本质上就是一个file handle,fstream在close的有要求不能在写入么?更一般的,dtor要求不能抛异常
: ...................
--
FROM 223.104.194.*