windows C++ Fiber (协程)
协程,也叫微线程,多个协程在逻辑上是并发的,实际并发由用户控件。
在windows上引入了纤程(fiber)。
WinBase.h 中函数原型
#if(_WIN32_WINNT >= 0x0400)//
// Fiber begin
//#pragma region Application Family or OneCore Family or Games Family
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM | WINAPI_PARTITION_GAMES)#define FIBER_FLAG_FLOAT_SWITCH 0x1 // context switch floating pointWINBASEAPI
VOID
WINAPI
SwitchToFiber(_In_ LPVOID lpFiber);WINBASEAPI
VOID
WINAPI
DeleteFiber(_In_ LPVOID lpFiber);#if (_WIN32_WINNT >= 0x0501)WINBASEAPI
BOOL
WINAPI
ConvertFiberToThread(VOID);#endifWINBASEAPI
_Ret_maybenull_
LPVOID
WINAPI
CreateFiberEx(_In_ SIZE_T dwStackCommitSize,_In_ SIZE_T dwStackReserveSize,_In_ DWORD dwFlags,_In_ LPFIBER_START_ROUTINE lpStartAddress,_In_opt_ LPVOID lpParameter);WINBASEAPI
_Ret_maybenull_
LPVOID
WINAPI
ConvertThreadToFiberEx(_In_opt_ LPVOID lpParameter,_In_ DWORD dwFlags);#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM | WINAPI_PARTITION_GAMES) */
#pragma endregion#pragma region Desktop Family or OneCore Family or Games Family
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM | WINAPI_PARTITION_GAMES)WINBASEAPI
_Ret_maybenull_
LPVOID
WINAPI
CreateFiber(_In_ SIZE_T dwStackSize,_In_ LPFIBER_START_ROUTINE lpStartAddress,_In_opt_ LPVOID lpParameter);WINBASEAPI
_Ret_maybenull_
LPVOID
WINAPI
ConvertThreadToFiber(_In_opt_ LPVOID lpParameter);#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM | WINAPI_PARTITION_GAMES) */
#pragma endregion//
// Fiber end
//
一个简单的例子
#include <iostream>
#include <Windows.h>LPVOID mainFiber,workFiber;int i;void fiberProc(LPVOID lpFiberParameter)
{for(i = 0;i < 10; ++i){SwitchToFiber(mainFiber);}
}int main(int argc,char** argv,char** env)
{mainFiber = ConvertThreadToFiber(NULL);workFiber = CreateFiber(1024,fiberProc,NULL);SwitchToFiber(workFiber);std::cout << i << std::endl;SwitchToFiber(workFiber);std::cout << i << std::endl;DeleteFiber(workFiber);ConvertFiberToThread();return 0;}
windows 上Fiber的调度需要用户自己控制
简单做一个协程调度
#include <iostream>
#include <Windows.h>
#include <list>
#include <functional>using co_proc = std::function<void(void*)>;void __co_proc(LPVOID lpParam);static int ids = 0;class scheduler;
class corountine
{
public:co_proc proc_;void* param_;corountine(co_proc proc,void* param):proc_(proc), param_(param),isfinished(false),id(++ids){this->fiber = CreateFiber(1024,__co_proc,this);}virtual ~corountine(){DeleteFiber(this->fiber);}LPVOID fiber;bool isfinished;int id;scheduler* sch;
};class scheduler
{std::list<corountine*> cos_;
public:scheduler(){mainFiber = ConvertThreadToFiber(NULL);}virtual ~scheduler(){ConvertFiberToThread();}void push_corountine(corountine* co){co->sch = this;cos_.push_back(co);}void run(){while(!cos_.empty()) {auto* co = cos_.front();cos_.erase(cos_.begin());if (!co->isfinished) {SwitchToFiber(co->fiber);}if (!co->isfinished) {cos_.push_back(co);} else {delete co;}}}void yield(){SwitchToFiber(mainFiber);}LPVOID mainFiber;};void __co_proc(LPVOID lpParam)
{corountine* co = (corountine*)lpParam;co->isfinished = false;co->proc_(co->param_);co->isfinished = true;SwitchToFiber(co->sch->mainFiber); // 一定要加上这句,不然主线程会结束
}int main(int argc,char** argv,char** env)
{scheduler sch;sch.push_corountine(new corountine([&](void* p){for (int i = 0;i < 7; ++i){std::cout << "i:"<<i<<std::endl;sch.yield();}},nullptr));sch.push_corountine(new corountine([&](void* p){for (int j = 0;j < 4; ++j){std::cout << "j:"<<j<<std::endl;sch.yield();}},nullptr));sch.run();return 0;}相关文章:
windows C++ Fiber (协程)
协程,也叫微线程,多个协程在逻辑上是并发的,实际并发由用户控件。 在windows上引入了纤程(fiber)。 WinBase.h 中函数原型 #if(_WIN32_WINNT > 0x0400)// // Fiber begin //#pragma region Application Family or OneCore Family or Game…...
游戏引擎学习第89天
回顾 由于一直没有渲染器,终于决定开始动手做一个渲染器,虽然开始时并不确定该如何进行,但一旦开始做,发现这其实是正确的决定。因此,接下来可能会花一到两周的时间来编写渲染器,甚至可能更长时间…...
2025新鲜出炉--前端面试题(一)
文章目录 1. vue3有用过吗, 和vue2之间有哪些区别2. vue-router有几种路由, 分别怎么实现3. webpack和rollup这两个什么区别, 你会怎么选择4. 你能简单介绍一下webpack项目的构建流程吗5. webpack平时有手写过loader和plugin吗6. webpack这块你平时做过哪些优化吗?7…...
教程 | i.MX RT1180 ECAT_digital_io DEMO 搭建(一)
本文介绍 i.MX RT1180 EtherCAT digital io DEMO 搭建,Master 使用 TwinCAT ,由于步骤较多,分为上下两篇,本文为第一篇,主要介绍使用 TwinCAT 控制前的一些准备。 原厂 SDK 提供了 evkmimxrt1180_ecat_examples_digit…...
Pyecharts系列课程04——折线图/面积图(Line)
本章我们学习在Pyecharts中折线图(Line)的使用。折线图通用应用于数据的趋势分析。 折线图 我们现在有两组数据,x_data是2024年的月份,y_data为对应张三甲每个月的用电量。 # 家庭每月用电量趋势 x_data ["1月", &q…...
变压器-000000
最近一个项目是木田12V的充电器,要设计变压器,输出是12V,电压大于1.5A12.6*1.518.9W. 也就是可以将变压器当成初级输入的一个负载。输入端18.9W. 那么功率UI 。因为变压器的输入是线性上升的,所以电压为二份之一,也就是1/2*功率…...
凝思60重置密码
凝思系统重置密码 - 赛博狗尾草 - 博客园 问题描述 凝思系统进入单用户模式,在此模式下,用户可以访问修复错误配置的文件。也可以在此模式下安装显卡驱动,解决和已加载驱动的冲突问题。 适用范围 linx-6.0.60 linx-6.0.80 linx-6.0.100…...
linux——网络计算机{序列化及反序列化(JSON)(ifdef的用法)}
linux——网络(服务器的永久不挂——守护进程)-CSDN博客 目录 一、序列化与反序列化 1. 推荐 JSON 库 2. 使用 nlohmann/json 示例 安装方法 基础用法 输出结果 3. 常见操作 4. 其他库对比 5. 选择建议 二、ifdef宏的用法 基本语法 核心用途…...
【教程】docker升级镜像
转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~ 目录 自动升级 手动升级 无论哪种方式,最重要的是一定要通过-v参数做数据的持久化! 自动升级 使用watchtower,可…...
迅为RK3568开发板篇OpenHarmony实操HDF驱动控制LED-编写应用APP
在应用代码中我们实现如下功能: 当应用程序启动后会获取命令行参数。如果命令行没有参数,LED 灯将循环闪烁;如果命令行带有参数,则根据传输的参数控制 LED 灯的开启或关闭。通过 HdfIoServiceBind 绑定 LED灯的 HDF 服务ÿ…...
python代码
python\main_script.py from multiprocessing import Process import subprocessdef call_script(args):# 创建一个新的进程来运行script_to_call.pyprocess Process(targetrun_script, args(args[0], args[1]))process.start()process2 Process(targetrun_script, args(arg…...
React 打印插件 -- react-to-print
一、安装依赖 npm install react-to-print 二、使用 import { useReactToPrint } from "react-to-print"; import React, { useRef, forwardRef } from react;const Content () > {const contentRef useRef(null);const reactToPrintFn useReactToPrint({ c…...
探索C语言简易计算器程序的实现与优化
在C语言编程学习中,实现一个简易计算器是一个常见且有趣的练习项目。它不仅能帮助我们巩固基本的语法知识,如函数、循环、分支结构,还能让我们深入理解程序设计的逻辑。接下来,我们将分析三段实现简易计算器功能的C语言代码&#…...
深入了解 MySQL:从基础到高级特性
引言 在当今数字化时代,数据的存储和管理至关重要。MySQL 作为一款广泛使用的开源关系型数据库管理系统(RDBMS),凭借其高性能、可靠性和易用性,成为众多开发者和企业的首选。本文将详细介绍 MySQL 的基础概念、安装启…...
OSPF基础(1):工作过程、状态机、更新
OSPF基础 1、技术背景(与RIP密不可分,因为RIP中存在的问题) RIP中存在最大跳数为15的限制,不能适应大规模组网周期性发送全部路由信息,占用大量的带宽资源以路由收敛速度慢以跳数作为度量值存在路由环路可能性每隔30秒…...
工业相机如何获得更好的图像色彩
如何获得更好的图像色彩 大部分的工业自动化检测中对物体的色彩信息并不敏感,因此会使用黑白的相机,但是在显微镜成像、颜色分类识别等领域,相机的色彩还原就显得格外重要,在调节相机色彩方面的参数时,有以下几个方面需…...
使用requestAnimationFrame减少浏览器重绘
文章目录 介绍使用使用rAF前使用rAF后 介绍 在屏幕中,浏览器通常都以60FPS(1/60 s)每帧更新屏幕,但是当前端绑定了一些高频事件,如鼠标移动,屏幕滚动、触摸滑动等时,在一帧的周期内,…...
Mac 终端命令大全
—目录操作— ꔷ mkdir 创建一个目录 mkdir dirname ꔷ rmdir 删除一个目录 rmdir dirname ꔷ mvdir 移动或重命名一个目录 mvdir dir1 dir2 ꔷ cd 改变当前目录 cd dirname ꔷ pwd 显示当前目录的路径名 pwd ꔷ ls 显示当前目录的内容 ls -la ꔷ dircmp 比较两个目录的内容 di…...
如何使用deepseek开发一个翻译API
什么是deepseek Deepseek 是一个基于人工智能技术的自然语言处理平台,提供了多种语言处理能力,包括文本翻译、语义分析、情感分析等。它通过深度学习模型和大规模语料库训练,能够实现高质量的文本翻译和多语言理解。Deepseek 的核心优势在于…...
vue如何解决跨域
文章目录 vue如何解决跨域1. 什么是跨域2. 如何解决2.1 CROS(Cross-Origin Resource Sharing,跨域资源共享)2.2 Proxy2.2.1 使用webpack proxy2.2.2 服务端代理转发2.2.3 通过nginx实现代理 vue如何解决跨域 1. 什么是跨域 跨域本质是浏览器…...
Agent Framework 中的 Workflow Composition
在前面的文章中,我们已经介绍了 Agent Framework 中如何定义流程节点,以及 Workflow 的流式执行事件。 如果你对这些概念还不太熟悉,可以先回顾上一篇文章: Agent Framework 定义流程节点以及节点的流式输出 这一节我们来介绍 Wor…...
2026运营经理学习数据分析对职场能力提升的影响
一、数据分析在运营管理中的核心价值数据分析能力帮助运营经理优化决策流程,通过数据驱动的方法提升业务效率。掌握用户行为分析、市场趋势预测等技能,能够更精准地制定运营策略。数据可视化工具(如Tableau、Power BI)的应用&…...
量子优化算法在组合优化问题中的应用与性能分析
1. 量子优化算法与组合优化问题概述组合优化问题广泛存在于物流调度、网络设计、芯片布局等工业场景中,其核心挑战在于从离散解空间中高效寻找最优解。传统经典算法在面对NP难问题时往往面临计算复杂度爆炸的困境。量子优化算法通过量子叠加和纠缠等特性,…...
【百度AI】从API调用到场景落地:车牌识别技术全解析
1. 车牌识别技术入门指南 第一次接触车牌识别技术时,我也被各种专业术语搞得一头雾水。简单来说,车牌识别就像给电脑装了一双"火眼金睛",让它能自动从照片或视频中找出车牌并读出上面的文字。这项技术现在已经深入到我们生活的方方…...
数字电路跨时钟域信号传输:从亚稳态到同步器设计实践
1. 跨时钟域信号传输:从亚稳态到可靠同步在数字芯片和FPGA设计中,只要系统里存在多个时钟,就绕不开跨时钟域(CDC)信号传输这个经典问题。这可不是什么高深莫测的理论,而是每个硬件工程师在画第一块板子、写…...
别再为FluidSIM 3.6安装报错头疼了!WinHEX找不到进程?看这篇保姆级图文教程就够了
FluidSIM 3.6安装疑难全解析:从报错修复到高效使用指南 当工科实验室的电脑屏幕再次弹出那个令人窒息的错误提示——"WinHEX找不到进程",许多初次接触FluidSIM的师生都会陷入束手无策的困境。这款由德国Festo公司与帕德博恩大学联合开发的液压…...
从ERR_CERT_COMMON_NAME_INVALID到安全连接:证书主题与域名匹配的实战指南
1. 当浏览器说"不信任"时发生了什么? 上周我在部署内部测试环境时,遇到了一个熟悉的红色警告页。Chrome用刺眼的红色告诉我:"您的连接不是私密连接",错误代码ERR_CERT_COMMON_NAME_INVALID。这就像你去银行办…...
taskwarrior-tui键盘绑定完全手册:成为效率达人的秘密武器
taskwarrior-tui键盘绑定完全手册:成为效率达人的秘密武器 【免费下载链接】taskwarrior-tui taskwarrior-tui: A terminal user interface for taskwarrior 项目地址: https://gitcode.com/gh_mirrors/ta/taskwarrior-tui taskwarrior-tui是一款功能强大的终…...
终极ModEngine2指南:从零开始掌握魂类游戏模组引擎
终极ModEngine2指南:从零开始掌握魂类游戏模组引擎 【免费下载链接】ModEngine2 Runtime injection library for modding Souls games. WIP 项目地址: https://gitcode.com/gh_mirrors/mo/ModEngine2 想要为《黑暗之魂3》或《艾尔登法环》添加自定义内容却苦…...
YouTube 视频翻译中文:基于 Whisper + FFmpeg 的自动化流水线实战
一、背景 YouTube 视频翻译中文,本质上是将外语视频通过语音识别(ASR)、文本翻译(NMT)、语音合成(TTS)三个环节处理后,重新合成为中文版本。每一个环节都有成熟的开源工具链支持&am…...
