Win32 函数可以异步运行在同一个线程上吗?

Posted

技术标签:

【中文标题】Win32 函数可以异步运行在同一个线程上吗?【英文标题】:Win32 Can functions asynchronously running on the same thread? 【发布时间】:2019-10-07 09:25:57 【问题描述】:

不知道win32函数是否可以异步运行在同一个线程上。

我在MSDN中看到了一个异步函数的例子

https://docs.microsoft.com/en-us/windows/win32/wsw/asyncmodelexample

这涉及多线程吗?

编辑:

异步功能只能通过多线程实现是真的吗?

【问题讨论】:

如果您阅读示例中的代码,其中一个函数是调用CreateThread(),并传递其他函数之一的地址。这是创建将执行传递函数的线程的 Windows API 方式。所以,是的,它是多线程的。 @Peter 异步功能只能通过多线程实现是真的吗? 不,这不是真的。但是,您想知道的是,是的,这是真的。请花一些时间阅读多线程的定义,您想了解的大部分内容都来自该定义。 不,不是。多线程只是一种方式。在单线程程序中可以进行异步操作。看看***.com/questions/34680985/… 这不完全正确,当线程不忙于执行代码并等待操作系统完成任务时,它在技术上是可能的。 QueueUserAPC() 是完成此任务的核心 winapi 函数。相当先进的编程技术,不经常使用并且与链接的文章无关。 【参考方案1】:

不知win32函数能否异步运行 同一个线程。

没有。 win32 函数服务于系统调用。它们在自己的上下文中运行(或者,您可以将它们视为系统线程)。它们可能会阻塞您的线程(同步系统调用)或不阻塞您的线程(异步调用)。 对于那些同步调用,它看起来像是在你的线程上运行(阻塞),但实际上它是在不同的上下文中运行的。

我在MSDN看到了一个异步函数的例子 https://docs.microsoft.com/en-us/windows/win32/wsw/asyncmodelexample 这涉及到多线程吗?

是的。这个例子实现了多线程(两个线程)。其中一个线程使用异步通知(回调函数)通知另一个线程结果。

异步函数只能通过 多线程?

没有。如前所述,某些系统功能是异步的(或同时具有同步和异步选项)。您可以使用这些函数来执行异步操作。就像系统为你提供了多线程,不需要自己实现多线程程序。

请注意,系统调用仅执行系统服务,即一组定义良好的系统函数。如果您需要在另一个线程中实现系统服务以外的其他内容,那么,是的,您需要另一个线程来完成。

【讨论】:

以上是关于Win32 函数可以异步运行在同一个线程上吗?的主要内容,如果未能解决你的问题,请参考以下文章

c# 的线程可以指定运行在指定的cpu核心上吗

在多核的系统中,同一个进程的2个线程可以分别同时运行在不同的核(cpu)上吗?

Win32 利用远程线程注入dll

Win32 利用远程线程注入dll

C/C++:std::thread构造函数死锁问题:WIN32下不可以在DllMain中创建线程

在另一个线程中运行异步函数