Windows for C中Fibers的正确用法是什么?

时间:2018-10-24 17:04:05

标签: c windows fibers

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

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

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

1)创建光纤后,我假设提供的功能执行不会立即开始,对吗?我相信有人需要先致电ConvertThreadToFiber。但是还有其他需要做的事情吗?我的意思是在最简单的情况下,定义,启动,运行和删除简单光纤的样子如何?

2)是否可以通过某种方式检查我们是否真正在光纤中?我的意思是光纤是否正在应用程序的其他部分执行?如果是,怎么办?

3)是否可以随时获取光纤堆栈的存储位置和光纤堆栈的实际内容?如果是,怎么办?

1 个答案:

答案 0 :(得分:1)

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

1)就像您说的那样,光纤本身并不运行。它仅在另一个线程通过调用Error in Formula: "This field name is not known"显式切换到该线程时运行。然后在该光纤上继续执行,直到 it 调用ReportClass.Export()并切换回原始线程或另一根光纤。

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

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

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