我最近对Windows中的光纤感兴趣,但我很难使用它。文档涉及函数定义和一些示例,但我仍然不清楚一些内容。我看到CreateFiber定义定义为:
LPVOID CreateFiber(
SIZE_T dwStackSize,
LPFIBER_START_ROUTINE lpStartAddress,
LPVOID lpParameter
);因此,我们指定堆栈大小、光纤的函数以及可能的函数参数。现在,我的问题是:
1)一旦光纤被创建,我假设提供的函数执行不会立即启动,对吗?我认为首先需要打电话给ConvertThreadToFiber。但还有什么其他事情需要做吗?我的意思是,在最简单的情况下,定义、启动、运行和删除一个简单的光纤是什么样子?
( 2)是否有可能以某种方式检查我们是否真的在纤维中?我的意思是,光纤是否在应用程序的其他部分执行?如果是,怎么做?
( 3)是否有可能在任何时候得到光纤堆栈的内存位置和光纤堆栈的实际内容?如果是,怎么做?
发布于 2018-10-24 17:22:04
(免责声明:我只编写了几个使用光纤的测试程序,以验证它们在运行时是否运行在我当时正在使用的性能分析器下。)
1)正如你说的,纤维不是靠自己来运转的。只有当另一个线程通过调用SwitchToFiber显式切换到它时,它才会运行。然后,在该光纤上继续执行,直到它调用SwitchToFiber并切换回原始线程或另一个光纤。
2)我不清楚你在这里问什么。如果光纤是唯一一个调用特定函数的,它可以设置一些变量或调用一个函数,您就会知道它在那里。如果多个光纤正在调用相同的函数,也许它们可以记录它们的线程id,您就可以推断出哪个光纤调用了这个函数。用例是什么?
3)如果光纤正在执行,它可以以正常方式访问其堆栈/寄存器。我不知道有一种方法可以任意访问当前未计划在线程上运行的光纤堆栈,但我想您可以从光纤本身中记录堆栈的地址。
不管它的价值如何,我不认为Windows中的光纤支持会被大量使用。
https://stackoverflow.com/questions/52974453
复制相似问题