Tecent libco C++协程库初探

news2025/1/15 13:11:35

安装

https://github.com/Tencent/libco 上把release版本的下下来:

mkdir build && cd build && cmake .. && make

拿到动态和静态库啦,然后cp到/usr/local/lib就完成安装啦。
项目有很多example,直接进根目录make就行了。

使用单线程多协程实现生产者消费者

说明:这个例子里面没有加锁,大多数情况,单线程多协程无需加锁,但是有些情况需要,比如两个协程同时写一个文件。下面这个生产者消费者模型不需要加锁,因为它操作的共享变量是安全的,而在多线程模型下,调度是抢占的,由系统内核发起的,需要加锁,而协程是用户级别的模拟并发。协程的优势在于切换协程带来的花销远小于线程切换,线程切换需要陷入内核,切换寄存器和栈,协程则不需要。在多线程编码时,条件变量需要和锁一起用,而在协程编程中,不需要这种和锁搭配的条件变量,libco实现了一个条件变量stCoCond_t
使用libco步骤:

  1. 写协程函数 void*(*p)(void*),入口写co_enable_hook_sys();启用协程HOOK项。
  2. 声明协程 stCoRoutine_t
  3. 创建协程co_create(&pProducerCo, NULL, productor, &fac);
  4. 开启协程 co_resume(pProducerCo);
  5. 开启事件循环 co_eventloop(co_get_epoll_ct(), NULL, NULL);

编译下面这个demo:

g++ -o main main.cc -lcolib -lpthread -ldl -g

或者

g++ -o main -Wl,-Bstatic main.cc -lcolib -Wl,-Bdynamic -lpthread -ldl -g 

由于我lib目录下有同名的libco静态和动态库,g++会默认使用动态库,如果想用静态库编译,使用第二个编译命令。另外 -ldl是必须的,貌似colib内部会加载一些基础动态库。

#include "co_routine.h"
#include <iostream>
#include <queue>
#include <functional>
// g++优先使用同名动态库 
// g++ -o main main.cc -lcolib -lpthread -ldl -g
// 使用同名静态库编译
// g++ -o main -Wl,-Bstatic main.cc -lcolib -Wl,-Bdynamic -lpthread -ldl -g 

int task = 0;
using namespace std;
class Factory {
public:
    Factory() {
        maxElement_ = 5;
        proCond_ = co_cond_alloc();
        conCond_ = co_cond_alloc();
    }
    stCoCond_t* proCond_;
    stCoCond_t* conCond_;
    queue<int> taskQ_;
    int maxElement_;
};

void* productor(void* arg) {
    // 启用协程HOOK项
    co_enable_hook_sys();
    Factory* fac = static_cast<Factory*>(arg);
    while (true) {
        while (fac->taskQ_.size() >= fac->maxElement_) {
            co_cond_timedwait(fac->proCond_, -1);
        }
        fac->taskQ_.push(task++);
        cout << "生产任务:" <<  fac->taskQ_.back() << endl;
        co_cond_signal(fac->conCond_);
    }
}

void* consumer(void* arg) {
    // 启用协程HOOK项
    co_enable_hook_sys();
    Factory* fac = static_cast<Factory*>(arg);
    while (true) {
        while (fac->taskQ_.empty()) {
            co_cond_timedwait(fac->conCond_, -1);
        }
        int task = fac->taskQ_.front();
        fac->taskQ_.pop();
        cout << "消费任务:" <<  task << endl;
        co_cond_signal(fac->proCond_);
    }
}

int main(int argc, char** argv) {
    const int nConsumer = 2;
    stCoRoutine_t* pProducerCo = NULL;
    stCoRoutine_t* pConsumerCo[nConsumer] = { NULL };
    Factory fac;
    // 创建启动生产者协程
    // 看源码可知该函数必返回0
    co_create(&pProducerCo, NULL, productor, &fac);
    co_resume(pProducerCo);
    cout << "start producer coroutine success" << endl;

    // 创建启动消费者协程
    for (int i = 0; i < nConsumer; i++)
    {
        co_create(&pConsumerCo[i], NULL, consumer, &fac);
        co_resume(pConsumerCo[i]);
    }
    cout << "start consumer coroutine success" << endl;
    // 启动循环事件
    co_eventloop(co_get_epoll_ct(), NULL, NULL);
    return 0;
}
消费任务:41253
消费任务:41254
生产任务:41255
生产任务:41256
生产任务:41257
生产任务:41258
生产任务:41259
消费任务:41255
消费任务:41256
消费任务:41257
消费任务:41258
消费任务:41259
生产任务:41260
生产任务:41261
生产任务:41262
生产任务:41263
生产任务:41264
消费任务:41260
消费任务:41261
消费任务:41262
消费任务:41263
消费任务:41264
生产任务:41265
生产任务:41266
生产任务:41267
生产任务:41268
生产任务:41269
消费任务:41265

在这里插入图片描述
只有一个线程,佐证了协程的含义。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/387729.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

phpinfo包含临时文件Getshell全过程及源码

目录 前言 原理 漏洞复现 靶场环境 源码 复现过程 前言 PHP LFI本地文件包含漏洞主要是包含本地服务器上存储的一些文件&#xff0c;例如session文件、日志文件、临时文件等。但是&#xff0c;只有我们能够控制包含的文件存储我们的恶意代码才能拿到服务器权限。假如在服…

B. Sherlock and his girlfriend

Sherlock has a new girlfriend (so unlike him!). Valentines day is coming and he wants to gift her some jewelry. He bought n pieces of jewelry. The i-th piece has price equal to i  1, that is, the prices of the jewelry are 2, 3, 4, ... n  1. Watson…

跳表--C++实现

目录 作者有话说 为何要学习跳表&#xff1f;为了快&#xff0c;为了更快&#xff0c;为了折磨自己..... 跳表作用场景 1.不少公司自己会设计哈希表&#xff0c;如果解决哈希冲突是不可避免的事情。通常情况下会使用链址&#xff0c;很好理解&#xff0c;当有冲突产生时&#…

深度学习训练营之识别宝可梦人物和角色

深度学习训练营之识别宝可梦人物和角色原文链接环境介绍前置工作设置GPU数据加载数据查看数据预处理加载数据可视化数据检查数据配置数据集prefetch()功能详细介绍&#xff1a;调用官方的网络的模型模型训练官方模型调用设置动态学习率模型训练模型评估结果分析参考链接原文链接…

【Redis】Redis 如何实现分布式锁

Redis 如何实现分布式锁1. 什么是分布式锁1.1 分布式锁的特点1.2 分布式锁的场景1.3 分布式锁的实现方式2. Redis 实现分布式锁2.1 setnx expire2.2 set ex px nx2.3 set ex px nx 校验唯一随机值&#xff0c;再删除2.4 Redisson 实现分布式锁1. 什么是分布式锁 分布式锁其实…

【C语言进阶:指针的进阶】回调函数

本章重点内容&#xff1a; 字符指针指针数组数组指针数组传参和指针传参函数指针函数指针数组指向函数指针数组的指针回调函数指针和数组面试题的解析什么是回调函数&#xff1a; 回调函数就是一个通过函数指针调用的函数。如果你把函数的指针&#xff08;地址&#xff09;作…

Lenovo 联想-IdeaPad-Y530电脑 Hackintosh 黑苹果efi引导文件

原文来源于黑果魏叔官网&#xff0c;转载需注明出处。硬件型号驱动情况主板联想-IdeaPad-Y530处理器Intel 酷睿2双核 T9400已驱动内存2GB已驱动硬盘2TB HP EX950 PCI-E Gen3 x4 NVMe SSD已驱动显卡NVIDIA GeForce 9300M GS无法驱动声卡Realtek ALC888无法驱动网卡RTL8168H Giga…

【Java学习笔记】3.Java 基础语法

Java 基础语法 一个 Java 程序可以认为是一系列对象的集合&#xff0c;而这些对象通过调用彼此的方法来协同工作。下面简要介绍下类、对象、方法和实例变量的概念。 对象&#xff1a;对象是类的一个实例&#xff0c;有状态和行为。例如&#xff0c;一条狗是一个对象&#xff…

【NLP相关】从零开始理解BERT模型:NLP领域的突破(BERT详解与代码实现)

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️&#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

Python异常处理更新,正常和不正常的都在这里

嗨害大家好鸭&#xff01;我是小熊猫~ 异常处理篇嗨害大家好鸭&#xff01;我是小熊猫~Python标准异常&#x1f4a8;什么是异常&#xff1f;不正常异常处理&#x1f4a8;使用except而不带任何异常类型使用except而带多种异常类型try-finally 语句异常的参数触发异常用户自定义异…

Lesson12---人工神经网络(1)

12.1 神经元与感知机 12.1.1 感知机 感知机&#xff1a; 1957&#xff0c; Fank Rosenblatt 由两层神经元组成&#xff0c;可以简化为右边这种&#xff0c;输入通常不参与计算&#xff0c;不计入神经网络的层数&#xff0c;因此感知机是一个单层神经网络 感知机 训练法则&am…

MyBatis - 13 - MyBatis逆向工程

文章目录1.准备工作1.1 建表1.2 创建Maven工程1.2.1 在pom.xml中添加依赖和插件&#xff0c;更新maven1.2.2 在src/main/resources下创建mybatis-config.xml1.2.3 在src/main/resources下创建jdbc.properties1.2.4 在src/main/resources下创建log4j.xml文件1.2.5 在src/main/re…

搭建zabbix4.0监控服务实例

一.Zabbix服务介绍 1.1服务介绍 Zabbix是基于WEB界面的分布式系统监控的开源解决方案&#xff0c;Zabbix能够监控各种网络参数&#xff0c;保证服务器系统安全稳定的运行&#xff0c;并提供灵活的通知机制让SA快速定位并解决存在的各种问题。 1.2 Zabbix优点 Zabbix分布式监…

python用openpyxl包操作xlsx文件,统计表中合作电影数目最多的两个演员

题目&#x1f389;&#x1f389;&#x1f389;&#xff1a;编程完成下面任务&#xff1a;已知excel文件“电影导演演员信息表.xlsx”如下图所示&#xff1a;&#x1f373;&#x1f373;&#x1f373;要求&#xff1a;使用 openpyxl 包操作打开此文件&#xff0c;编写程序统计在…

sqlli-labs基本使用

1.安装hackbar插件 链接&#xff1a;https://pan.baidu.com/s/1-QIYmAU-BV_DEONfxovizQ 提取码&#xff1a;dc66 2.SQL注入表信息解析&#xff08;案例使用的sqlli-labs自带的数据库security&#xff09; 2.1 通过order by 判断表有多少列 分析表有多少列&#xff08;通过…

【Storm】【六】Storm 集成 Redis 详解

Storm 集成 Redis 详解 一、简介二、集成案例三、storm-redis 实现原理四、自定义RedisBolt实现词频统计一、简介 Storm-Redis 提供了 Storm 与 Redis 的集成支持&#xff0c;你只需要引入对应的依赖即可使用&#xff1a; <dependency><groupId>org.apache.storm…

红日(vulnstack)2 内网渗透ATTCK实战

环境配置 链接&#xff1a;百度网盘 请输入提取码 提取码&#xff1a;wmsi 攻击机&#xff1a;kali2022.03 web 192.168.111.80 10.10.10.80 自定义网卡8&#xff0c;自定义网卡18 PC 192.168.111.201 10.10.10.201 自定义网卡8&#xff0c;自定义网卡18 DC 192.168.52.1…

【Word/word2007】将标题第1章改成第一章

问题&#xff1a;设置多级列表没有其他格式选的解决办法和带来的插入图注解的问题&#xff0c;将标题第1章改成第一章的问题其他方案。 按照百度搜索的方法设置第一章&#xff0c;可以是没有相应的样式可以选。 那就换到编号选项 设置新的编号值 先选是 然就是变得很丑 这时打开…

数据结构(一)(嵌入式学习)

数据结构干货总结&#xff08;一&#xff09;基础线性表的顺序表示线性表的链式表示单链表双链表循环链表循环单链表循环双链表栈顺序存储链式存储队列队列的定义队列的常见基本操作队列的顺序存储结构顺序队列循环队列队列的链式存储结构树概念二叉树二叉树的创建基础 数据&a…

项目实战典型案例14——代码结构混乱 逻辑边界不清晰 页面美观设计不足

代码结构混乱 逻辑边界不清晰 页面美观设计不足一&#xff1a;背景介绍问题1 代码可读性差&#xff0c;代码结构混乱问题2 逻辑边界不清晰&#xff0c;封装意识缺乏示例3.展示效果上的美观设计二&#xff1a;思路&方案问题一&#xff0c;代码可读性差&#xff0c;代码结构混…