免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5162 | 回复: 16
打印 上一主题 下一主题

[函数] 发现一个有意思的东西 [复制链接]

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-05-21 00:03 |只看该作者 |倒序浏览
本帖最后由 zylthinking 于 2013-05-21 00:05 编辑

记得之前版上有几个将动态语言中 yield 等语义用 C 来实现的尝试,  今天看文档, 居然发现 posix 已经在N年前支持了这个语义,  这个应该在 pthread 之前出现的, 看样子, 应该是 pthread 的兴起才导致它的没落, 不过, 即便在现在, 貌似在一定的场所, 也有用处:
  1. #include <string.h>
  2. #include <ucontext.h>
  3. #include <stdio.h>

  4. // 64kB stack
  5. #define FIBER_STACK 1024*64

  6. ucontext_t child, parent;

  7. // The child thread will execute this function
  8. void threadFunction()
  9. {
  10.          printf( "Child fiber yielding to parent\n" );
  11.          swapcontext( &child, &parent );
  12.          printf( "Child thread exiting\n" );
  13.          swapcontext( &child, &parent );
  14. }

  15. int main()
  16. {
  17.          // Get the current execution context
  18.          getcontext( &child );

  19.          // Modify the context to a new stack
  20.          child.uc_link = 0;
  21.          child.uc_stack.ss_sp = malloc( FIBER_STACK );
  22.          child.uc_stack.ss_size = FIBER_STACK;
  23.          child.uc_stack.ss_flags = 0;
  24.          if ( child.uc_stack.ss_sp == 0 )
  25.          {
  26.                  perror( "malloc: Could not allocate stack" );
  27.                  exit( 1 );
  28.          }

  29.          // Create the new context
  30.          printf( "Creating child fiber\n" );
  31.          makecontext( &child, &threadFunction, 0 );

  32.          // Execute the child context
  33.          printf( "Switching to child fiber\n" );
  34.          swapcontext( &parent, &child );
  35.          printf( "Switching to child fiber again\n" );
  36.          swapcontext( &parent, &child );

  37.          // Free the stack
  38.          free( child.uc_stack.ss_sp );

  39.          printf( "Child fiber returned and stack freed\n" );

  40.          return 0;
复制代码

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
2 [报告]
发表于 2013-05-21 08:35 |只看该作者
没用过linux,看不懂,但看起来似乎类似windows下的“纤程(fiber)”。
当然windows下的纤程我也没用过,只是知道它是干啥屌事用的。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
3 [报告]
发表于 2013-05-21 09:34 |只看该作者
有人说其实和 pthread 效率差不多,
差别就是 pthread 会抢占式调度,context 不会。

如果所有 threads 用同一个 mutex 控制,阻止 thread 调度。
效果就和 context 差不多了。

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
4 [报告]
发表于 2013-05-21 10:05 |只看该作者
群雄逐鹿中原 发表于 2013-05-21 09:34
有人说其实和 pthread 效率差不多,
差别就是 pthread 会抢占式调度,context 不会。


不一样, 这个具备 schedue_to(thread_id) 能力

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
5 [报告]
发表于 2013-05-21 10:09 |只看该作者
zylthinking 发表于 2013-05-21 10:05
不一样, 这个具备 schedue_to(thread_id) 能力


这个更强大!用这个,结合 alarm,貌似可以实现出pthread

论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:032015年亚洲杯之中国
日期:2015-04-22 15:52:45
6 [报告]
发表于 2013-05-21 10:20 |只看该作者
这个在多异步交互的逻辑server里用处很大, 不过没见过封装得很好的框架.
可以避免存取context的麻烦事情, 同时能把异步进程写得像同步进程一样, 加快开发效率.
别的场景直接用线程就是了, 犯不着这么麻烦.

论坛徽章:
0
7 [报告]
发表于 2013-05-21 18:15 |只看该作者
这个应该叫 N:1线程, 就是N个线程, 映射到一个系统执行流,pth就是这样的。
现在的linux native thread是1:1线程,即一个线程,对应一个执行流。
早期的solaris系统上有更BT的M:N线程,(M>=N)把M个线程映射到N个系统执行流上,有点类似epoll+线程池的模式。

论坛徽章:
0
8 [报告]
发表于 2013-05-21 18:16 |只看该作者
我在2个年就发过类似的帖子, 当时貌似没人看明白我说的意思。

论坛徽章:
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
9 [报告]
发表于 2013-05-21 19:17 |只看该作者
咩哈哈, 楼主是不是在指我的帖子, 我的世界没人懂啊.

论坛徽章:
1
程序设计版块每日发帖之星
日期:2015-09-23 06:20:00
10 [报告]
发表于 2013-05-21 22:47 |只看该作者
coroutine, 网上有些开源的coroutine library for C, 在某些时候比多线程效率更高。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP