Windows 中 C 的纤维的正确用法是什么?

What's the proper usage of Fibers in Windows for C?

我最近对 ​​Windows 中的 Fibers 很感兴趣,但我很难使用它。该文档涉及功能定义和一些示例,但我仍然不清楚一些内容。我看到 CreateFiber 定义定义为:

LPVOID CreateFiber(
  SIZE_T                dwStackSize,
  LPFIBER_START_ROUTINE lpStartAddress,
  LPVOID                lpParameter
);

因此,我们指定堆栈大小、纤程的函数以及可能的函数参数。现在,我的问题是:

1) 创建纤程后,我假设所提供的函数不会立即开始执行,对吗?我相信需要先调用 ConvertThreadToFiber 。但是还有其他事情需要做吗?我的意思是在最简单的情况下,如何定义、启动、运行 和删除一个简单的纤程?

2) 是否有可能以某种方式检查我们是否真的在光纤中?我的意思是 fiber 是否在应用程序的其他部分内部执行?如果是,如何?

3) 是否可以随时获取纤程栈的内存位置和纤程栈的实际内容?如果是,如何?

(免责声明:我只编写了一些使用纤程的测试程序,以验证它们在 运行 在我当时正在使用的性能分析器下运行时是否正常工作。)

1) 正如您所说,纤维本身并不 运行。当另一个线程通过调用 SwitchToFiber 显式切换到它时,它仅 运行s。然后在该纤程上继续执行,直到 调用 SwitchToFiber 并切换回原始线程或另一个纤程。

2) 我不清楚你在这里问什么。如果 fiber 是唯一一个调用特定函数的函数,它可以设置一些变量或调用一个函数,你就会知道它在那里。如果多个纤程调用同一个函数,也许它们可以记录它们的线程 ID,这样您就可以推断出哪个纤程调用了该函数。这里的用例是什么?

3) 如果纤程正在执行,它可以以正常方式访问其 stack/registers。我不知道有什么方法可以任意访问线程上当前未安排到 运行 的纤程堆栈,但我想您可以从纤程本身内部记录堆栈地址。

就其价值而言,我认为 Windows API 中的光纤支持使用不多。