开源项目cpp_features提供了一个仿golang协程的stackful协程库. 可以在c++中使用golang的协程,大概语法是这样的:

 #include <iostream>

 void foo()
{
std::cout << "foo" << std::endl;
} co_main()
{
go foo;
}

怎么样,语法是不是和golang很像? 以下是这个项目的ReadMe


coroutine是一个使用C++11编写的调度式stackful协程库, 同时也是一个强大的并行编程库 
目前支持两个平台:

Linux   (GCC4.8+)
Win7-64bit (VS2013/2015)

使用coroutine编写并行程序,即可以像golang、erlang这些并发语言一样 
开发迅速且逻辑简洁,又有C++原生的性能优势,鱼和熊掌从此可以兼得。

coroutine有以下特点: 
* 1.提供golang一般功能强大协程,基于corontine编写代码,可以以同步的方式编写简单的代码,同时获得异步的性能, 
* 2.支持海量协程, 创建100万个协程只需使用1GB内存 
* 3.允许用户自由控制协程调度点,随意变更调度线程数; 
* 4.支持多线程调度协程,极易编写并行代码,高效的并行调度算法,可以有效利用多个CPU核心 
* 5.可以让链接进程序的同步的第三方库变为异步调用,大大提升其性能。 
再也不用担心某些DB官方不提供异步driver了,比如hiredis、mysqlclient这种客户端驱动可以直接使用,并且可以得到不输于异步driver的性能。 
* 6.动态链接和静态链接全都支持,便于使用C++11的用户静态链接生成可执行文件并部署至低版本的linux系统上。 
* 7.提供协程锁(co_mutex), 定时器, channel等特性, 帮助用户更加容易地编写程序. 
* 8.网络性能强劲,超越ASIO异步模型;尤其在处理小包和多线程并行方面非常强大。

  • 如果你发现了任何bug、有好的建议、或使用上有不明之处,可以提交到issue,也可以直接联系作者: 
    email: 289633152@qq.com QQ交流群: 296561497

  • coroutine/samples目录下有很多示例代码,内含详细的使用说明,让用户可以循序渐进的学习coroutine库的使用方法。

coroutine的编译与使用:

  • Linux: 
    0.如果你安装了ucorf,那么你已经安装过coroutine了,可以跳过第1步. 
    1.使用CMake进行编译安装:

        $ mkdir build
    $ cd build
    $ cmake .. -DCMAKE_BUILD_TYPE=RELEASE
    $ sudo make install

    如果希望编译可调试的版本, 只需要cmake那行命令变为:

        $ cmake ..

    2.以动态链接的方式使用时,一定要最先链接libcoroutine.so,还需要链接libdl.so. 例如:

        g++ -std=c++11 test.cpp -lcoroutine -ldl [-lother_libs]

    3.以静态链接的方式使用时,只需链接libcoroutine.a即可,不要求第一个被链接,但要求libc.a最后被链接. 例如:

        g++ -std=c++11 test.cpp -lcoroutine -static -static-libgcc -static-libstdc++
  • Windows: 
    1.使用git submodule update –init下载子模块 
    2.进入coroutine/win_patch/VS2015目录, 打开coroutine.sln,不必编译整个解决方案,只需编译coroutine工程即可。其中的测试工程是依赖boost-x64的,如果要编译请先编译64bit的boost库: 
    编译参数:

       bjam.exe address-model=64 --build-type=compelete

    至少编译system和thread两个库,然后调整工程设置中的引用boost的路径 
    3.编译coroutine项目(默认的工程配置暂时只配置了x64-Debug-mt版,需要其他版本请自行修改工程配置) 
    4.使用时需要添加两个include目录:coroutine和coroutine/win_patch

网络库:

  • 基于coroutine编写的网络库,在network目录中,支持udp/tcp协议

RPC框架:

在C++中使用golang的协程的更多相关文章

  1. GoLang之协程

    GoLang之协程 目前,WebServer几种主流的并发模型: 多线程,每个线程一次处理一个请求,在当前请求处理完成之前不会接收其它请求:但在高并发环境下,多线程的开销比较大: 基于回调的异步IO, ...

  2. Golang 之协程详解

    转自:https://www.cnblogs.com/liang1101/p/7285955.html 一.Golang 线程和协程的区别 备注:需要区分进程.线程(内核级线程).协程(用户级线程)三 ...

  3. [golang note] 协程基础

    协程概念 √ 协程通常称为coroutine,在golang中称为goroutine. √ 协程本质上是一种用户态线程,它不需要操作系统来进行抢占式调度,在实际实现中寄存在线程之中. √ 协程系统开销 ...

  4. C#中的yield return与Unity中的Coroutine(协程)(下)

    Unity中的Coroutine(协程) 估计熟悉Unity的人看过或者用过StartCoroutine() 假设我们在场景中有一个UGUI组件, Image: 将以下代码绑定到Image using ...

  5. 『GoLang』协程与通道

    作为一门 21 世纪的语言,Go 原生支持应用之间的通信(网络,客户端和服务端,分布式计算)和程序的并发.程序可以在不同的处理器和计算机上同时执行不同的代码段.Go 语言为构建并发程序的基本代码块是 ...

  6. Golang 的 协程调度机制 与 GOMAXPROCS 性能调优

    作者:林冠宏 / 指尖下的幽灵 掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8 博客:http://www.cnblogs.com/linguan ...

  7. golang:协程安全

    多路复用 Go语言中提供了一个关键字select,通过select可以监听channel上的数据流动.select的用法与switch语法类似,由select开始一个新的选择块,每个选择条件由case ...

  8. 如何在django视图中使用asyncio(协程)和ThreadPoolExecutor(多线程)

    Django视图函数执行,不在主线程中,直接 loop = asyncio.new_event_loop() # 更不能loop = asyncio.get_event_loop() 会触发 Runt ...

  9. python中IO多路复用、协程

    一.IO多路复用 IO多路复用:检测多个socket是否已经发生变化(是否已经连接成功/是否已经获取数据)(可读/可写) import socket def get_data(key): client ...

随机推荐

  1. 【2013微软面试题】输出节点数为n的二叉树的所有形态

    转自:http://blog.csdn.net/monsterxd/article/details/8449005 /* *  题意,求节点数为n的二叉树的所有形态,先要想个方式来唯一标示一棵二叉树 ...

  2. 40个最好的Tumblr主题

    如果安装了一款较好的Tumblr主题,你的Tumblr空间将焕然一新.然而找到一款合适的主题并不是一件容易的事,这正是本文中我整理那么多优质的Tumblr模板作为灵感的原因.其中有一些免费的Tumbl ...

  3. Linux网卡启动报错(this device is not active)

    重启网络服务 service network restart   报如下错误:   shutting down interface eth0: error:device "eth0" ...

  4. IOS 异步加载图片

    #import <Foundation/Foundation.h> #import "StringUtils.h" @interface ImageManager : ...

  5. SQL Server常用元数据函数

    元数据函数 1.获取数据库标识符DB_ID DB_ID函数用于获取当前数据库的唯一ID(int数据类型),数据库ID用于服务器上唯一区分书库. 语法结构: DB_ID (['database_name ...

  6. easyui dialog遮罩层

    当dialog在一个iframe里时,此dialog的遮罩层也会只覆盖这个iframe,要想覆盖整个页面,就把dialog写到最外层的父页面中去,此时dialog的遮罩层会自动覆盖整个页面,若需要从子 ...

  7. devexpress皮肤设置

    DEV的皮肤管理控件:SkinController: TdxSkinController; 皮肤设置:SkinController.SkinName := appInfo.SkinName; TdxR ...

  8. “IPSec 共享密钥”丢失。

    “IPSec 共享密钥”丢失.请验证您的设置并尝试重新连接. 但是这个vpn原来使用时不需要配置 共享的密钥,而且我也没有这个共享的密钥, 搜了下Mac OSX可以修改配置来绕过它. 在/etc/pp ...

  9. POJ 3169 Layout (差分约束)

    题意:给定一些母牛,要求一个排列,有的母牛距离不能超过w,有的距离不能小于w,问你第一个和第n个最远距离是多少. 析:以前只是听说过个算法,从来没用过,差分约束. 对于第 i 个母牛和第 i+1 个, ...

  10. spring html特殊字符操作

    import org.springframework.web.util.HtmlUtils; /**    * html特殊字符操作    * @param answer 操作default=转换为H ...