1

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

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

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

1)一旦创建了纤程,我假设提供的功能执行不会立即开始,对吗?我相信需要先打电话ConvertThreadToFiber。但是还有其他需要做的事情吗?我的意思是在最简单的情况下,定义、启动、运行和删除一个简单的纤程是什么样子的?

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

3)是否有可能在我们希望的任何时刻获取光纤堆栈的内存位置和光纤堆栈的实际内容?如果是,如何?

4

1 回答 1

1

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

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

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

3)如果纤程正在执行,它可以以正常方式访问其堆栈/寄存器。我不知道有一种方法可以任意访问当前未计划在线程上运行的光纤堆栈,但我想您可以从光纤本身中记录堆栈的地址。

对于它的价值,我认为 Windows API 中的光纤支持使用不多。

于 2018-10-24T17:22:04.797 回答