免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: joepayne

[C++] Boost asio 连接池问题 [复制链接]

论坛徽章:
0
发表于 2017-11-15 20:51 |显示全部楼层
回复 9# joepayne

你看清楚这个shared_ptr的生命期,已经释放了。

论坛徽章:
0
发表于 2017-11-15 20:59 |显示全部楼层

你服务器是异步多线程的(指的是你用多线程调用io_service.run()了),实质上也是需要缓冲的,只不过你的代码暂时没有连续发送或者多线程进行发送,所用显不出问题。


论坛徽章:
3
亥猪
日期:2013-08-28 12:50:23白羊座
日期:2013-11-25 12:55:50酉鸡
日期:2014-02-12 10:46:13
发表于 2017-11-15 21:20 |显示全部楼层
回复 11# Fixend



我好像看明白了,因为是异步的,把socket传递给service内部的shared_ptr后,acceptor已经进入新一轮InitAccept 函数了,所以在service发送完数据后,这个socket的count已经变为1了,这时delete 就自然把这个socket给关闭关掉了。

感谢大神!我再fix一下,看行不

论坛徽章:
3
亥猪
日期:2013-08-28 12:50:23白羊座
日期:2013-11-25 12:55:50酉鸡
日期:2014-02-12 10:46:13
发表于 2017-11-15 21:26 |显示全部楼层
回复 12# Fixend

那这里应该如何整个缓冲区,保证多线程发送是安全的呢?

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
发表于 2017-11-15 21:39 |显示全部楼层
线程池,同步、异步IO,连接池这些我有体会,boost不熟。看看你们怎么搞。

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
发表于 2017-11-16 10:52 |显示全部楼层
说明你还是封装的不够抽象,看看我的https://github.com/owenliang/boost_asio

论坛徽章:
3
亥猪
日期:2013-08-28 12:50:23白羊座
日期:2013-11-25 12:55:50酉鸡
日期:2014-02-12 10:46:13
发表于 2017-11-16 11:12 |显示全部楼层
回复 16# linux_c_py_php

好详细啊,还有日志部分,我得好好温故学习一下。你的头像看着好熟悉的感觉,好像当初写UC的时候也是看你的blog入的门。In touch!

论坛徽章:
0
发表于 2017-11-16 13:38 |显示全部楼层
同步和异步可能没和你说明白:
客户要求同步,也就是说等你发成功再返回。
但网络层一定是异步的,否则效率太低。也就是说在应用层做成同步,简单封装一下。
伪代码:
SendData
{
tcpsend();//异步发送,其实是放到发送队列中,由发送线程去发。
wait...  // 等待发送成功或失败的通知事件,或在回调函数里等
return ...;
}
boost里用bind来绑定回调,也是异步的。同步你在应用层处理就行了。

论坛徽章:
3
亥猪
日期:2013-08-28 12:50:23白羊座
日期:2013-11-25 12:55:50酉鸡
日期:2014-02-12 10:46:13
发表于 2017-11-16 14:21 |显示全部楼层
本帖最后由 joepayne 于 2017-11-16 16:08 编辑

回复 18# sxcong


你的意思是,应用层线程各自调SendData 将数据异步地写往发送队列(缓存),再由发送线程发送数据,发送完通知应用层线程,然后应用层线程返回。
那我可不可以这样臆想,应用层线程写入数据的缓存(queue)是一个exclusive(加mutex)或者aotmic(lock-free)的东西,保证应用层线程能够安全的写数据;发送线程应用线程应该是并行的关系,而且发送线程才是socket的owner,由它从缓存(queue)进行读取操作,然后将数据写入socket,并由它来管理并控制socket的资源。

那这里我有一个问题,你这里说的发送线程,难道是asio内部维护的线程?那这样的线程有几个呢,是一个缓存(queue)对应一个发送线程吗?还有发送线程跟应用线程之间是如何进行通信的呢?

想搞清楚这些,聪哥能否给予一些指点,或者有对应的详尽资料对照看看?

论坛徽章:
0
发表于 2017-11-16 14:48 |显示全部楼层
我设计的发送线程大致是这样的:
while()
{
getData();//从队列中取一个数据,队列就是你说的加锁的缓冲
send();    //异步发送
}
onSend() //boost发送的回调函数
{
触发成功或失败事件
}

asio官方带的例子有异步发送,创建多个对象就是多路同时发了。

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP