Linux c学习 2.3.1 协程
📅 2026/7/14 5:51:16
👁️ 次浏览
为什么有协程这个东西因为要用同步的编程方式实现异步的性能。一、同步是什么async_dns_client_noblock.c 是一个用来把dns域名解析为ip的程序。在这个程序中int main(int argc, char *argv[]) { //tong bu //dns_client_commit(argv[1]); int count sizeof(domain) / sizeof(domain[0]); int i 0; for (i 0;i count;i ) { dns_client_commit(domain[i]); } }dns_client_commit(domain[i]);这个函数会阻塞一直卡到DNS查询完成后返回结果。如果第十个域名匹配成功则会浪费10倍的查询时间。同步是在同一个线程中既负责检查事件就绪又负责读写io。二、异步是什么int main(int argc, char *argv[]) { struct async_context *ctx dns_async_client_init(); if (ctx NULL) return -2; int count sizeof(domain) / sizeof(domain[0]); int i 0; for (i 0;i count;i ) { dns_async_client_commit(ctx, domain[i], dns_async_client_result_callback); //sleep(2); } getchar(); }dns_async_client_init();会创建epoll负责监听就绪事件。分配并初始化异步上下文在堆上分配一块零初始化的内存用于存放async_context结构体将epollfd存进去。创建一个新线程这个线程专门执行dns_async_client_proc(ctx)函数主线程负责接受用户请求创建 DNS 查询 socket发送 DNS 请求包然后将 socket 注册到 epoll立即返回继续处理下一个请求。Reactor 线程负责监听所有 socket 的响应一旦收到 DNS 回复就调用回调函数通知用户结合图片1. 初始化阶段主线程 Reactor 线程│ │├─ epoll_create() │├─ 分配 ctx │├─ 创建 Reactor 线程 ──────────→ ││ ├─ epoll_wait() 阻塞等待├─ usleep(1) │ 没有事件阻塞住│ 让出 CPU 给子线程 │2. 提交异步请求阶段dns_async_client_commit主线程每次调用 dns_async_client_commit│├─ 创建 UDP socket├─ 构造 DNS 查询包├─ sendto() 发送请求非阻塞立即返回├─ 将 socket 注册到 ctx-epfd│ epoll_ctl(ADD, EPOLLIN)├─ 保存回调函数到某个数据结构└─ 立即返回不等待结果3. Reactor 线程处理完成事件Reactor 线程循环│├─ epoll_wait() 返回就绪的 socket├─ 找出这个 socket 对应的回调函数├─ 调用 recvfrom() 读取 DNS 响应├─ 解析 DNS 响应包提取 IP 地址├─ 调用回调函数 dns_async_client_result_callback(domain, result)│ 通知用户DNS 查询完成├─ 清理 socket 和上下文└─ 继续下一轮 epoll_wait()实际测试中同步解析耗时1.575s 异步耗时0.17s。异步显然比同步要快。server mul port .c是一份用来接收百万并发连接的tcp服务器。在该程序中异步是开辟一块线程池封装成job扔到线程池。epoll只负责检查是否就绪。读写io的recv和send做成一个任务io_task, 交给其他线程。每创建1000个端口所用时间1593ms。同步则是在同一个线程中既负责检查事件就绪又负责读写io。每创建1000个端口所用时间7300ms显然异步同样比同步要快。三、协程是什么可是异步在编程的时候判断当前接口是否可操作不可就跳转到下一个。来回飞雷神导致代码及其看不懂。所以把“保存上下文”、“切换”封装起来让人感觉不到这就是用同步的方式实现异步的性能。四、协程在代码中是如何实现的while (1) { char buffer[128] {0}; int count read(clientfd, buffer, 128); if (count 0) { break; } write(clientfd, buffer, count); printf(sockfd: %d, clientfd: %d, count: %d, buffer: %s\n, sockfd, clientfd, count, buffer); } ssize_t read(int fd, void *buf, size_t count) { struct pollfd fds[1] {0}; fds[0].fd fd; fds[0].events POLLIN; int res poll(fds, 1, 0); if (res 0) { // // fd -- epoll_ctl(); swapcontext(); // fd -- ctx }在代码中重写了一个read。当调用read是会执行自己写好的read。先把fd放到poll里面。做一个判断如果可读则去读。如果不可读把fd加入epoll里面监听可读事件。调用swapcontext保留信息跳转到其他协程里面。如果可读之后则会加入epoll就绪队列切换回当前的协程继续处理。
主要功能:
硬件探测:检测USB连接状态,查看设备详情
文件救援:强制读取损坏U盘中的数据
无损修复:修复文件系统错误,保留原有数据
深度重构:重建分区表,彻底修复严重损坏
使用方法&am…
📅 2026/7/14 5:51:16
说实话,第一次看到 _geo鞋 这个词的时候,我内心是拒绝的。总觉得又是哪个品牌搞出来的新花样,专门收割那些不懂行的韭菜。毕竟现在市面上各种“黑科技”、“纳米材料”、“量子能量”满天飞,听得人脑仁疼。但作为一个在鞋圈摸爬滚打多年的老炮儿,我深知现在的消费者越来越…
📅 2026/7/14 5:50:27
今年5月底,工作室接了一单数据引擎的结构化数据采集:客户做的是法律行业的数据趋势分析,需要对百度数据结果页做日级增量抓取,关键词量不大,但对成功率要求很硬,掉一天的数据整个时间序列就断了。选供应商这…
📅 2026/7/14 5:50:16
AMD开发者必备:FLUX.2-klein-4B-amdnpu模型部署常见问题与解决方案 【免费下载链接】FLUX.2-klein-4B-amdnpu 项目地址: https://ai.gitcode.com/hf_mirrors/amd/FLUX.2-klein-4B-amdnpu
FLUX.2-klein-4B-amdnpu是一款针对AMD NPU优化的轻量级文本到图像生成…
📅 2026/7/14 7:21:46
1. 项目概述:为什么我们需要AssetStudio?如果你是一名Unity开发者、游戏爱好者,或者对游戏资源逆向感兴趣,那么你一定遇到过这样的场景:看到一个精美的游戏特效、一段独特的UI界面或者一个有趣的模型,想研究…
📅 2026/7/14 7:21:46
SDXL-Turbo on AMD NPU未来展望:AMD NPU生态发展趋势 【免费下载链接】sdxl-turbo-amdnpu 项目地址: https://ai.gitcode.com/hf_mirrors/amd/sdxl-turbo-amdnpu
SDXL-Turbo on AMD NPU是一款基于扩散技术的文本到图像生成模型,由AMD优化适配其N…
📅 2026/7/14 7:21:46
1. 项目概述:为什么Unity Lua内存泄漏如此棘手?如果你在Unity项目里用过xLua做热更新,大概率经历过这样的场景:游戏跑着跑着,手机开始发烫,帧率越来越低,最后直接闪退或者卡死。重启一下&#x…
📅 2026/7/14 7:21:46
SESR-M7代码实现深度剖析:onnx_runner.py核心模块功能解析 【免费下载链接】sesr-m7-256x256-tiles-amdnpu 项目地址: https://ai.gitcode.com/hf_mirrors/amd/sesr-m7-256x256-tiles-amdnpu
引言:SESR-M7超分辨率模型与ONNX运行器
SESR-M7是AM…
📅 2026/7/14 7:21:46
昨晚熬夜搞这个,眼睛都快瞎了。真的,现在的AI广告工具吹得神乎其神,好像只要输入几个关键词,钱就能像流水一样进来。我信了。真的信了。结果呢?账户余额掉得比我的发际线还快。事情是这样的。上周二,我接了个私活,给一家做本地家政的公司投流。老板是个实在人,预算不多…
📅 2026/7/14 7:21:17
从“创始人投影”到“真理映射”——大语言模型认知本质的哲学批判与范式重构
摘要
当前全球主流大语言模型(LLMs)在技术指标上持续突破,却在认知本质上陷入了一种根本性的“搞反”状态:它们本应成为人类超越自身认知局限的“传…
📅 2026/7/14 0:00:05
Hadoop 3.2.2 JDK 21 Windows开发环境全流程实战指南对于需要在Windows环境下进行大数据开发的Java/Scala开发者来说,搭建一个本地Hadoop开发环境是入门的第一步。本文将带你从零开始,完成Hadoop 3.2.2与JDK 21的环境搭建,并实现一个完整的M…
📅 2026/7/14 0:00:05
1. 项目概述:为什么你需要Boost库? 如果你用C写过一些项目,尤其是涉及到网络、并发、文件系统或者需要处理一些复杂数据结构时,大概率会听过或者用过Boost库。它不是C标准库的一部分,但它在C社区的地位,几…
📅 2026/7/14 0:00:05
豆包openclaw最近圈子里都在聊豆包openclaw,我也没忍住,掏腰包入手了一套。说实话,刚拿到手的时候,心里是打鼓的。毕竟市面上类似的智能硬件太多了,有的吹得天花乱坠,用起来却是一堆bug。为了不让大家的钱打水漂,我连续用了半个月。从开箱到日常高频使用,甚至故意测试它…
📅 2026/7/14 6:35:02
SQLyog 13.3.1 社区版在Windows 10/11上的完整安装与连接指南 对于刚接触MySQL数据库管理的开发者和学生来说,选择一个直观易用的图形化管理工具至关重要。SQLyog作为一款轻量级但功能强大的MySQL GUI工具,能够显著提升数据库操作的效率和体验。本文将详…
📅 2026/7/13 6:21:22
SPEC CPU 2006 跨平台基准测试深度实战:ARM/X86/MIPS 架构配置优化与结果分析方法论在当今多元化的计算架构时代,如何客观评估不同处理器平台的真实性能成为系统工程师和性能优化专家的核心挑战。SPEC CPU 2006 作为业界公认的计算密集型基准测试套件&am…
📅 2026/7/14 7:15:18
目录
第一步:选对模板,省心一半
第二步:打开扫码点餐功能
开启功能按钮
桌台管理与桌码生成
第三步:个性化设计,打造品牌感
调整点餐页面
设置点餐规则 你还在让顾客站着排队点餐吗?2025年ÿ…
📅 2026/7/13 3:29:47
在业务中快速构建一个能理解私有文档、准确回答专业问题的智能助手,是很多开发团队面临的共同挑战。传统方案往往需要从零开始搭建复杂的 RAG(检索增强生成)系统,涉及文档解析、向量化、检索、大模型调用等多个环节,整…
📅 2026/7/13 19:47:36
FAE放射组学分析工具:医学影像特征探索的完整解决方案 【免费下载链接】FAE FeAture Explorer 项目地址: https://gitcode.com/gh_mirrors/fae/FAE
你是否曾经面对海量医学影像数据感到无从下手?想要从CT、MRI等影像中提取有价值的定量特征&#…
📅 2026/7/13 9:07:16