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

Fibers(纤程)是Windows平台提供的一种用户态线程机制,允许一个线程在多个执行流之间手动切换。与线程不同,Fibers由程序员显式调度,操作系统不参与调度过程。C++中使用Fibers可以实现协程或协作式多任务,但仅限于Windows系统。
1. 初始化线程为纤程支持
在使用Fibers之前,必须将当前线程转换为纤程或将其设为支持纤程的线程。调用 ConvertThreadToFiber 可以将当前线程转为纤程:示例代码:
#include <windows.h>
#include <iostream>
<p>int main() {
// 将当前线程转换为纤程,传入的参数可作为上下文
void* fiber = ConvertThreadToFiber(nullptr);
if (!fiber) {
std::cerr << "Failed to convert thread to fiber." << std::endl;
return 1;
}</p><pre class="brush:php;toolbar:false;">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;
<pre class="brush:php;toolbar:false;">// 模拟一些工作
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);
<pre class="brush:php;toolbar:false;">// 创建新纤程,指定栈大小、函数和参数
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;
};
<p>void __stdcall FiberWithCtx(void<em> param) {
FiberContext</em> ctx = static_cast<FiberContext*>(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,调试和维护成本较高,需谨慎使用。











