zoukankan      html  css  js  c++  java
  • c协程库libco几点体会

    https://www.cnblogs.com/dearplain/p/9820913.html

    这里说的是Tencent开源的libco。

    libco的用途和依赖

    主要还是c/c++服务端,相比libevent,libco支持的平台有限。但是libco显得更先进,可以写“阻塞式代码”,改造旧库的时候甚至不需要改代码。

    libco是独立的库,没有侵入性,能插入到几乎所有代码中使用。但是,libco需要运行一个永久阻塞的函数,这意味着,libco是独占的,一个系统线程内,不能有其他调度和阻塞函数,比如阻塞的网络函数,其他coroutine的类似实现,无限循环等。

    学习libco的方法

    看例子是最快最直观的,官方库上就有很多example。

    libco的调度,相比goroutine的不同

    libco需要通过co_yield_ct()等yield函数主动进行切换,切换出去的微线程,需要其他微线程co_resume才能运行,否则是不会被调度的。这个和goroutine不一样。

    libco的网络函数,会主动调用yield函数进行切换,然后由运行event_loop的微线程恢复,因此需要显式地调用co_eventloop这个函数。

    libco的栈大小

    libco的栈可以是独立的,也可以是共享的。

    独立的预先申请栈大小使用,注意栈的大小,通常比较小。

    共享的先申请一个大栈,然后libco切换的时候根据栈使用的大小拷贝到另一个内存。因此最大值还是受到共享栈大小的影响。

    libco的信息保存在哪里

    libco的微线程信息,保持一个context上,这个context根据线程pid保存在一个全局大数组上。所以每一个线程独立调度下面的所有微线程。

    所以每一个系统线程,有网络收发的都需要调用co_eventloop。

    libco如何获得实际的栈大小

    获得栈顶之后减去栈基。
    //get curr stack sp
    char c;
    curr->stack_sp= &c;

    int len = stack_mem->stack_bp - occupy_co->stack_sp;

  • 相关阅读:
    arcgis10.2 sde配置
    创建只读账号oracle
    oracle 的tnsnames.ora,listener.ora
    gp工具的许可
    复制整个数据库
    显示二维表格的位置计算
    windows文件名格式的中文+数字混合字符串排序
    supergridcontrol记录,分页
    outlook-由于本机的限制,该操作已被取消。请与系统管理员联系。
    自定义单元格式
  • 原文地址:https://www.cnblogs.com/dearplain/p/9820913.html
Copyright © 2011-2022 走看看