我最近讨论了async-await如何工作,我想知道我是否正确。
async-await是否通过将线程的ESP堆栈指针切换为指向不同的堆栈帧来工作?这类似于WINAPI fibres或旧的Win3.1协作式多任务处理。
例如,请考虑以下代码:
int Foo() {
int y = ReadSomethingFromConsole();
int x = await DoSomethingAsync();
return x+y;
}
调用堆栈如下所示:
EventLoop(...);
.......
Foo();
在我们到达await
语句时,计划在线程池中运行一个新任务,并且await
立即将ESP指针切换为指向我们所在的新堆栈帧在EventLoop()
功能。不会丢弃当前堆栈帧的内存段,只是ESP不再指向它。
事件循环然后运行更多事件,直到通知任务完成。此时,ESP切换为指向Foo()
函数的堆栈段。
我是否理解正确,这是如何运作的?
修改:await
如何创建新的堆叠框架?是否复制了一些“模板”堆栈帧快照,类似于VM快照?