Windows Fibers是用户态线程机制,需调用ConvertThreadToFiber将线程转为纤程支持,再通过CreateFiber创建纤程并用SwitchToFiber实现手动切换,纤程间可传递上下文数据,但仅限Windows平台且需手动管理生命周期与栈资源。

Fibers(纤程)是Windows平台提供的一种用户态线程机制,允许一个线程在多个执行流之间手动切换。与线程不同,Fibers由程序员显式调度,操作系统不参与调度过程。C++中使用Fibers可以实现协程或协作式多任务,但仅限于Windows系统。
1. 初始化线程为纤程支持
在使用Fibers之前,必须将当前线程转换为纤程或将其设为支持纤程的线程。调用 ConvertThreadToFiber 可以将当前线程转为纤程:示例代码:
#include#include int main() { // 将当前线程转换为纤程,传入的参数可作为上下文 void* fiber = ConvertThreadToFiber(nullptr); if (!fiber) { std::cerr << "Failed to convert thread to fiber." << std::endl; return 1; }
std::cout << "Main fiber started." << std::endl; // 后续可创建其他纤程并切换 ConvertFiberToThread(); // 清理,转回普通线程 return 0;}
2. 创建和切换纤程
使用 CreateFiber 创建新的纤程,指定其执行函数和栈空间。然后通过 SwitchToFiber 在不同纤程间切换。定义纤程函数:
void __stdcall FiberFunction(void* param) { std::cout << "Executing fiber. Param: " << param << std::endl;// 模拟一些工作 for (int i = 0; i < 3; ++i) { std::cout << "Fiber working... " << i << std::endl; SwitchToFiber(param); // 切换回主纤程或其他纤程 } std::cout << "Fiber ending." << std::endl;}
创建并切换纤程:
立即学习“C++免费学习笔记(深入)”;
int main() { void* mainFiber = ConvertThreadToFiber(nullptr);// 创建新纤程,指定栈大小、函数和参数 void* childFiber = CreateFiber( 0, // 使用默认栈大小 FiberFunction, // 纤程函数 mainFiber // 参数:切换回主纤程 ); if (!childFiber) { std::cerr << "Failed to create fiber." << std::endl; ConvertFiberToThread(); return 1; } std::cout << "Switching to child fiber." << std::endl; SwitchToFiber(childFiber); // 切换到子纤程 std::cout << "Back in main fiber." << std::endl; // 清理 DeleteFiber(childFiber); ConvertFiberToThread(); return 0;}
3. 使用纤程上下文传递数据
Fibers可以通过参数传递上下文信息,例如共享状态或回调函数。每个纤程的栈独立,但可通过指针共享数据。可以在创建纤程时传入结构体指针作为参数,在纤程函数中进行处理:
struct FiberContext { int id; const char* name; };void __stdcall FiberWithCtx(void param) { FiberContext ctx = static_cast
(param); std::cout << "Fiber ID: " << ctx->id << ", Name: " << ctx->name << std::endl; // 执行任务... } 4. 注意事项与限制
- Fibers仅在Windows上可用,跨平台项目需考虑替代方案(如Boost.Context或C++20协程)
- 不能在Fiber中调用某些Windows API,否则可能导致未定义行为
- 每个Fiber有独立栈,但总内存消耗受进程限制
- 必须手动管理生命周期:CreateFiber 需配对 DeleteFiber,ConvertThreadToFiber 需配对 ConvertFiberToThread
- 不支持异常跨越纤程边界传播
基本上就这些。Fibers适合实现轻量级协作式任务调度,但现代C++更推荐使用标准协程(C++20)或第三方库简化开发。Windows Fibers属于底层API,调试和维护成本较高,需谨慎使用。











