免费注册 查看新帖 |

Chinaunix

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

[C] 寻求建议,关于异步编程 [复制链接]

论坛徽章:
0
21 [报告]
发表于 2014-12-17 16:47 |只看该作者
回复 20# yulihua49

我担心这样做的性能,因为这样你肯定要用到堆来分配,堆本身是可以有线程切换的,这样可能导致整个机制的性能降低很多。

除此之外,还有栈上数据复制,也是耗时操作。





   

论坛徽章:
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
22 [报告]
发表于 2014-12-17 20:49 |只看该作者
本帖最后由 yulihua49 于 2014-12-17 21:02 编辑
codechurch 发表于 2014-12-17 16:47
回复 20# yulihua49

我担心这样做的性能,因为这样你肯定要用到堆来分配,堆本身是可以有线程切换的,这 ...

一般情况,进入不了IO未完成状态,我正想办法如何强制它进入这个状态呢。
内存分配,有个tcmalloc,可以改善。
memcpy,取决于数据量,一般情况,也就是几层调用,数据不会太多。
这些CPU的消耗量,可以通过多核多线程稀释掉。作为交易中间件,交易处理是大头,框架里的这些开销并不重要。
能否帮我看看,我那个栈帧,定的对不对,有关的边界处理,有否疏漏。

论坛徽章:
0
23 [报告]
发表于 2014-12-18 10:32 |只看该作者
回复 22# yulihua49

我突然想到一个严重的问题。

栈上的指针以及指向此栈的指针怎么办?

如果另外malloc内存,指针都变wild了。




   

论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:032015年亚洲杯之中国
日期:2015-04-22 15:52:45
24 [报告]
发表于 2014-12-18 11:12 |只看该作者
codechurch 发表于 2014-12-18 10:32
回复 22# yulihua49

我突然想到一个严重的问题。


你多虑了, context切换回来时, 肯定要把栈拷贝回来的.
或者说, 你在生成协程进行处理时, 就得把栈指针切到他自己malloc出的那块内存里.

论坛徽章:
0
25 [报告]
发表于 2014-12-18 11:32 |只看该作者
回复 24# hanxin83


不对。

假设原来有指针指向 0x04001 , 而 0x04001在你的栈 0x0400里,这个栈是你分配的堆块。

切换之后,你分配到新的堆块 0x0800 ,而原来的那个指针还指向 0x04001 , 此时会崩溃。

关键在于,你无法改变其他对象对此栈的引用。


   

论坛徽章:
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
26 [报告]
发表于 2014-12-18 11:40 |只看该作者
回复 23# codechurch

这不是个问题,所有创建的桟都会在某个时刻彻底清空然后销毁。

但C++的异常会是个问题,如果这么用,一旦在某个点上有一个C++函数抛出了异常,unwind过程会一直持续到桟清空,如果一直到这里异常还没有被捕获,unwind就会持续到这个桟之外,然后程序就挂了。
要避免这种情况,你必须让每个context的底端都有一个catch(...)的函数,在这个函数之外不能再抛出任何异常,要不然这个程序里就不能直接或间接的调用任何C++程序,Fiberized.IO的fiber入口点函数就干了这事。

老实说C++的异常真不是什么好东西,不过这么多年都这样,也只能这样了……

论坛徽章:
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 [报告]
发表于 2014-12-18 11:42 |只看该作者
回复 25# codechurch

不会崩溃的,尽管你切换到其它stack去了,但4001那块stack不是还在那儿吗。

论坛徽章:
0
28 [报告]
发表于 2014-12-18 11:44 |只看该作者
回复 26# windoze


类似于这样的代码,怎么处理?


int  a;

my_scanf("%d", &a);   

-------

假如在my_scanf函数里fiber挂起,栈被回收。fiber再运行后,a就是a'了,地址不一样了。




论坛徽章:
0
29 [报告]
发表于 2014-12-18 11:46 |只看该作者
回复 27# windoze

4001已经分配给其他fiber使用了,肯定会崩溃的。
   

论坛徽章:
0
30 [报告]
发表于 2014-12-18 12:05 |只看该作者
所以,我认为,在原生语言及直接能操作内存的语言(而对内存没有额外的锁定机制的(C#就有锁定机制,锁定内存后,可以屏蔽GC的效果)),其栈都不可能在yield时被回收,其上数据不能拷贝,因为拷贝后就让指针向它的指针失去意义了。(原生语言没有类型反射机制,也不可能知道谁指向这个栈了。) 除非你再次分配的地址跟原来是一样的。当然这也是一种选择,windows支持预留地址,linux我不知道。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP