免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 蔡万钊
打印 上一主题 下一主题

[C++] [转]ASIO 与协程 [复制链接]

论坛徽章:
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
21 [报告]
发表于 2015-03-03 14:10 |只看该作者
本帖最后由 yulihua49 于 2015-03-03 14:15 编辑
windoze 发表于 2015-03-03 13:20
回复 16# xphh2008

@yulihua49和我做的都不是通常意义上的coroutine,说它是M:N threading更准确

有的系统没有装libaio和eventfd。网上的下载版本都太老,不支持eventfd。
我公司的两个系统,一个没有libaio,一个没有eventfd。。。。。。。。
说明我这个轮子从来没人造过。

论坛徽章:
0
22 [报告]
发表于 2015-03-03 14:25 |只看该作者
windoze 发表于 2015-03-03 13:20
回复 16# xphh2008

@yulihua49和我做的都不是通常意义上的coroutine,说它是M:N threading更准确


了解。

其实@yulihua49里面那个coroutine只是用来保存函数断点上下文,以便yield之后重入。

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:50:28
23 [报告]
发表于 2015-03-03 15:48 |只看该作者
协程的出现是为了什么?

论坛徽章:
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
24 [报告]
发表于 2015-03-03 16:05 |只看该作者
蔡万钊 发表于 2013-04-22 16:36
转贴自  http://microcai.org/2013/04/22/asio-statemachine.html

前段时间看了 ASIO 爸爸关于ASIO的一 ...

楼主把我们忽悠到这,自己跑了个干净。

论坛徽章:
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
25 [报告]
发表于 2015-03-03 16:08 |只看该作者
本帖最后由 yulihua49 于 2015-03-03 16:37 编辑
www1862 发表于 2015-03-03 15:48
协程的出现是为了什么?

在发生异步IO时,你要让出CPU,让别人干活。但是自己的过程要简洁,连贯,看起来像同步IO。
  1.         do {
  2.                 *buffer=0;
  3.                 r_len=AIO_read(fd,buffer,sizeof(buffer));
  4.                 if(r_len<=0) break;
  5.                 NetHead->PROTO_NUM=0;
  6.                 NetHead->data=buffer;
  7.                 NetHead->PKG_LEN=r_len;
  8.                 NetHead->ERRNO1=0;
  9.                 if(r_len==sizeof(buffer))
  10.                         NetHead->ERRNO2=PACK_CONTINUE;
  11.                 else
  12.                         NetHead->ERRNO2=0;
  13.                 li_ret=SendPack(connect,NetHead);
  14.                 if(li_ret) {
  15.                         ShowLog(1,"%s: SendPack2 ret=%d,err=%d,%s",__FUNCTION__,li_ret,
  16.                                 errno,strerror(errno));
  17.                         close(fd);
  18.                         return -1;
  19.                 }
  20.         } while(r_len==sizeof(buffer));
复制代码
这个程序你很容易看懂。是个发送文件的服务器端的应用插件。
注意3和13行,那是异步IO,线程会跑掉为别的客户端工作。
在没有AIO的时候,这个程序一工作,传文件,好几分钟,服务器不能响应其他任何请求。
在没有协程的时候,这个流程将被切割成:工作 放弃 测试完成否,继续循环。。。。非常凌乱。

还有,windoze:那个buffer是64K的局部变量。SendPack会压缩数据(如果没有足够的尺寸,压缩效果就不好),它要530多K的栈,这就600K左右了。你不给足够的栈不行的。

论坛徽章:
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
26 [报告]
发表于 2015-03-04 10:54 |只看该作者
本帖最后由 yulihua49 于 2015-03-04 11:08 编辑
xphh2008 发表于 2015-03-03 14:25
了解。

其实@yulihua49里面那个coroutine只是用来保存函数断点上下文,以便yield之后重入。

今天进行了测试。
先设置服务器单线程。
一个客户端进行文件传输,16个客户端进行数据库访问。互相几乎没有影响,操作很流畅。
不管有没有文件传输,数据库访问时间没有明显差别。
奇怪的是,设置4个线程,竟然比单线程慢。数据库时间从1秒左右长到2-3秒。
2核CPU。任务是IO瓶颈型。

论坛徽章:
44
15-16赛季CBA联赛之浙江
日期:2021-10-11 02:03:59程序设计版块每日发帖之星
日期:2016-07-02 06:20:0015-16赛季CBA联赛之新疆
日期:2016-04-25 10:55:452016科比退役纪念章
日期:2016-04-23 00:51:2315-16赛季CBA联赛之山东
日期:2016-04-17 12:00:2815-16赛季CBA联赛之福建
日期:2016-04-12 15:21:2915-16赛季CBA联赛之辽宁
日期:2016-03-24 21:38:2715-16赛季CBA联赛之福建
日期:2016-03-18 12:13:4015-16赛季CBA联赛之佛山
日期:2016-02-05 00:55:2015-16赛季CBA联赛之佛山
日期:2016-02-04 21:11:3615-16赛季CBA联赛之天津
日期:2016-11-02 00:33:1215-16赛季CBA联赛之浙江
日期:2017-01-13 01:31:49
27 [报告]
发表于 2015-03-04 17:14 |只看该作者
回复 25# yulihua49

唉……你说你为神马要把64K的一个buffer放在栈上……真心不是个好习惯的说……
你放在connection对象之类的东西里做成员变量不好么,还可以用配置文件命令行参数神马的调一下大小,反正一个connection在一个方向上,在一个给定时刻,只能使用一个I/O buffer对不?

论坛徽章:
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
28 [报告]
发表于 2015-03-04 20:18 来自手机 |只看该作者
本帖最后由 yulihua49 于 2015-03-04 20:30 编辑

你无法限制应用插件的行为。64k?小的。你没看见那个530k栈的压缩器?第三方的,不关我事。

论坛徽章:
44
15-16赛季CBA联赛之浙江
日期:2021-10-11 02:03:59程序设计版块每日发帖之星
日期:2016-07-02 06:20:0015-16赛季CBA联赛之新疆
日期:2016-04-25 10:55:452016科比退役纪念章
日期:2016-04-23 00:51:2315-16赛季CBA联赛之山东
日期:2016-04-17 12:00:2815-16赛季CBA联赛之福建
日期:2016-04-12 15:21:2915-16赛季CBA联赛之辽宁
日期:2016-03-24 21:38:2715-16赛季CBA联赛之福建
日期:2016-03-18 12:13:4015-16赛季CBA联赛之佛山
日期:2016-02-05 00:55:2015-16赛季CBA联赛之佛山
日期:2016-02-04 21:11:3615-16赛季CBA联赛之天津
日期:2016-11-02 00:33:1215-16赛季CBA联赛之浙江
日期:2017-01-13 01:31:49
29 [报告]
发表于 2015-03-05 10:59 |只看该作者
回复 28# yulihua49

你说的是quicklz?刚才抽空看了一眼它的源代码,哪来的530k stack?最大的函数qlz_decompress_core也就声明了这些stack变量

  1.         const unsigned char *src = source + qlz_size_header((const char *)source);
  2.         unsigned char *dst = destination;
  3.         const unsigned char *last_destination_byte = destination + size - 1;
  4.         ui32 cword_val = 1;
  5.         const unsigned char *last_matchstart = last_destination_byte - UNCONDITIONAL_MATCHLEN - UNCOMPRESSED_END;
  6.         unsigned char *last_hashed = destination - 1;
  7.         const unsigned char *last_source_byte = source + qlz_size_compressed((const char *)source) - 1;
复制代码
没几个字节啊?

论坛徽章:
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
30 [报告]
发表于 2015-03-05 13:27 |只看该作者
本帖最后由 yulihua49 于 2015-03-05 13:38 编辑
windoze 发表于 2015-03-05 10:59
回复 28# yulihua49

你说的是quicklz?刚才抽空看了一眼它的源代码,哪来的530k stack?最大的函数qlz_ ...

size_t qlz_compress(const void *source, char *destination, size_t size)
{
        qlz_state_compress state;//530K

当然可以改成:
qlz_state_compress *state=mmap(。。。。
老是分配-释放,有点问题没?

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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP