【发布时间】:2020-01-08 23:17:13
【问题描述】:
我不明白我的小代码示例的输出。
当我在 MS C++/WinRT 代码中调试时,我看到对 WINRT_TrySubmitThreadpoolCallback() 和 WINRT_CreateThreadpoolTimer() 的调用。我认为 g() 的 3 次执行应该同时发生。
这段代码:
auto g() -> IAsyncAction {
Log(L"Entering g()");
co_await winrt::resume_after(1s);
Log(L"Exiting g()");
}
auto f() -> IAsyncAction {
Log(L"Entering f()");
co_await winrt::resume_background();
Log(L"First call to g()");
co_await g();
Log(L"Second call to g()");
co_await g();
Log(L"Third call to g()");
co_await g();
Log(L"Exiting f()");
}
auto main() -> int {
init_apartment();
f().get();
return 0;
}
输出以下内容(以线程 ID 为前缀):
24000 Entering f()
13160 First call to g()
13160 Entering g()
13160 Exiting g()
13160 Second call to g()
13160 Entering g()
13160 Exiting g()
13160 Third call to g()
13160 Entering g()
13160 Exiting g()
13160 Exiting f()
它不会同时运行 g() 的实例。不应该吗?
我正在 Slack (Cpplang#coroutines) 上讨论这个问题,很多人都在努力让我理解为什么我的示例代码会这样工作。由于他们的解释不是 C++/WinRT 特定的,我希望在这里有另一个答案。
谢谢。
【问题讨论】:
-
C++/WinRT 没有发明任何魔法。这些只是您的常规 C++ 协程。如果 C++ 解释没有意义,那么任何 C++/WinRT 特定的解释也没有意义。这里没有特定于 C++/WinRT 的内容。