lib-zo,C语言另一个协程库,激活文件IO操作协程化

lib-zo,C语言另一个协程库,激活文件IO操作协程化

另一个 C 协程库 https://blog.youkuaiyun.com/eli960/article/details/146802313

支持文件IO协程化的函数列表,请查看:
https://blog.youkuaiyun.com/eli960/article/details/146802313

支持文件IO操作协程化

关键开关:

    // 设置协程阻塞线程的数量限制为3
    zvar_coroutine_block_pthread_count_limit = 3;
    // 启用协程文件IO使用阻塞线程
    zvar_coroutine_fileio_use_block_pthread = 1;

一般模型

// 包含协程相关的头文件
#include "coroutine.h"
static void *file_do(void *arg)
{
	// 在这里操作open/read/write, 就都是协程化的
}

int main(int argc, char **argv)
{
    int i;
    // 初始化协程库
    zcoroutine_base_init();

    // 设置协程阻塞线程的数量限制为3
    zvar_coroutine_block_pthread_count_limit = 3;
    // 启用协程文件IO使用阻塞线程
    zvar_coroutine_fileio_use_block_pthread = 1;

    // 启动一个新的协程执行 file_do 函数
    zcoroutine_go(file_do, 0, 0);
    
    // 启动协程库运行
    zcoroutine_base_run();
    // 清理协程库资源
    zcoroutine_base_fini();
    return 0;
}

文件IO协程化例子

注意: 下面例子, 函数 file_do 中, 用到的 open/write/lseek/close/sleep 等都是协程化的

/*
 * ================================
 * eli960@qq.com
 * http://linuxmail.cn/
 * 2018-07-10
 * ================================
 */

// 包含协程相关的头文件
#include "coroutine.h"

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/syscall.h>
#include <fcntl.h>

// 静态变量,用于记录当前运行的协程数量
static int co_count = 0;

/**
 * @brief 协程执行的文件操作函数
 * 
 * 该函数会打开一个名为 "a.txt" 的文件,向文件中写入数据,
 * 然后将文件指针重置到文件开头,重复该过程100次。
 * 每次操作完成后会休眠1秒。当所有协程都完成操作后,会通知协程库停止运行。
 * 
 * @param arg 传递给协程的参数,在本函数中未使用
 * @return void* 函数返回值,固定返回0
 */
static void *file_do(void *arg)
{
    // 定义要操作的文件名
    char *fn = "a.txt";
    // 以读写模式打开文件,如果文件不存在则创建,同时截断文件内容
    int fd = open(fn, O_RDWR|O_CREAT|O_TRUNC, 0777);
    // 检查文件是否成功打开
    if (fd == -1) {
        // 若打开失败,输出错误信息
        fprintf(stderr, "can not open %s(%m)\n", fn);
        return 0;
    }
    // 循环100次,向文件中写入数据并重置文件指针
    for (int i=0;i < 100; i++) {
        // 向文件中写入8字节的数据
        if (write(fd, "0123456789", 8) != 8) {
            // 若写入失败,输出错误信息
            fprintf(stderr, "write error\n");
        }
        // 将文件指针重置到文件开头
        if (lseek(fd, 0, SEEK_SET) == (off_t)-1) {
            // 若重置失败,输出错误信息
            fprintf(stderr, "lseek error (%m)");
        }
        // 休眠1秒
        sleep(1);
    }
    // 关闭文件
    close(fd);
    // 协程完成操作,协程数量减1
    co_count--;
    // 检查是否所有协程都已完成操作
    if (co_count == 0) {
        // 若所有协程都已完成,输出通知信息
        fprintf(stderr, "zcoroutine_base_stop_notify\n");
        // 通知协程库停止运行
        zcoroutine_base_stop_notify(0);
    }
    return 0;
}

/**
 * @brief 程序入口函数
 * 
 * 初始化协程库,设置协程相关的参数,创建多个协程执行文件操作,
 * 然后启动协程库运行,最后清理协程库资源。
 * 
 * @param argc 命令行参数的数量
 * @param argv 命令行参数的数组
 * @return int 程序的退出状态码,固定返回0
 */
int main(int argc, char **argv)
{
    int i;
    // 初始化协程库
    zcoroutine_base_init();

    // 设置协程阻塞线程的数量限制为3
    zvar_coroutine_block_pthread_count_limit = 3;
    // 启用协程文件IO使用阻塞线程
    zvar_coroutine_fileio_use_block_pthread = 1;

    // 设置要创建的协程数量为10
    co_count = 10;
    // 循环创建协程
    for (i=0;i<co_count;i++) {
        // 启动一个新的协程执行 file_do 函数
        zcoroutine_go(file_do, 0, 0);
    }
    // 输出提示信息,表示程序将在100秒后退出
    printf("exit after 100s\n");
    // 输出提示信息,表示文件IO操作在工作线程中运行
    printf("file io running in worker pthread\n");
    // 输出提示信息,建议使用 strace 命令跟踪线程
    printf("strace -p pthrad_id\n");
    // 启动协程库运行
    zcoroutine_base_run();
    // 清理协程库资源
    zcoroutine_base_fini();
    // 休眠1秒
    sleep(1);
    return 0;
}
已经博主授权,源码转载自 https://pan.quark.cn/s/a4b39357ea24 常见问题解答 网页打开速度慢或者打不开网页? 受到多种因素的影响,对于非会员用户我们无法提供最优质的服务。 如果您希望得到最棒的体验,请至大会员页面("右上角菜单 → 大会员")根据说明操作。 请注意:受制于国际网络的诸多不确定性,我们无法对任何服务的可靠性做出任何保证。 如果出现了网络连接相关的问题,我们建议您先等待一段时间,之后再重试。 如果您在重试后发现问题仍然存在,请联系我们,并说明网络问题持续的时间。 图片下载后无法找到? 打开"右上角菜单 → 更多 → 修改下载路径",在弹出的对话框中可以看到当前图片的保存路径。 此外,由于网络因素,在保存图片之后,等待屏幕下方出现"已保存到..."后,才能在本地找到图片。 如何更改图片保存的目录? 请参见"右上角菜单 → 更多 → 修改下载路径"。 翻页不方便? 在点进某个图片后,通过在图片上向左或向右滑动,即可翻页查看下一个作品。 如何保存原图/导出动图? 长按图片/动图,在弹出的菜单中选择保存/导出即可。 输入账号密码后出现"进行人机身份验证"? 此为pixiv登陆时的验证码,请按照要求点击方框或图片。 在pxvr中注册pixiv账号后,收到验证邮件,无法访问邮件中的验证链接? 请复制邮件中的链接,打开pxvr中的"右上角菜单 → 输入地址"进行访问。 能否自动将页面内容翻译为汉语? 很抱歉,pxvr暂不提供语言翻译服务。 图片下载类型是否可以选择? 能否批量下载/批量管理下载? 已支持批量下载多图作品中的所有原图:找到一个多图作品,进入详情页面后,点击图片进入多图浏览模式,长按任意一张图片即可看到批量下载选项。 关于上述其他功能,我们...
考虑局部遮阴的光伏PSO-MPPT控制模型(Simulink仿真实现)内容概要:本文介绍了基于Simulink仿真实现的考虑局部遮阴的光伏PSO-MPPT控制模型,旨在通过粒子群优(PSO)算法解决光伏发电系统在局部阴影条件下最大功率点跟踪(MPPT)的效率问题。文档不仅提供了该模型的技术实现方法,还列举了大量相关的MATLAB/Simulink仿真资源,涵盖电力系统、智能优算法、机器学习、路径规划、信号处理等多个科研方向,适用于复现高水平期刊论文和开展创新性研究。文中强调科研需逻辑缜密、善于借力,并提倡结合实际仿真与理论分析以提升研究深度。 适合人群:具备一定电力电子、自动控制或新能源背景,熟悉MATLAB/Simulink环境,从事光伏系统优、智能算法应用或相关领域研究的研发人员及硕博研究生。 使用场景及目标:①研究局部遮阴下光伏系统MPPT控制策略的性能提升;②利用PSO等智能优算法解决非线性、多峰值优问题;③复现SCI/EI级别论文中的MPPT控制模型;④开展光伏系统建模与仿真教学或项目开发。 阅读建议:建议读者结合文档提供的网盘资源,下载完整代码与模型文件,按照目录顺序逐步学习,重点理解PSO算法在MPPT中的应用机制,并通过修改参数、对比实验等方式深入掌握仿真细节,提升工程实践与科研创新能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值