1

在第 97 行的头文件中有一个奇怪的类似函数的宏,winbase.h如下所示:

#define Yield()

这是为了什么?

4

1 回答 1

3

Windows 3.x 使用协作多任务模型。所有应用程序(也称为“任务”)曾经在单个线程上的相同内存空间中运行。通常,任务之间的切换是由GetMessage应用程序主消息循环中的 API 执行的。Yield()曾经是自愿切换到另一个应用程序的方式(例如,如果进行冗长的 CPU 密集型处理)。这是一篇相关的 MSKB 文章,它仍然存在。

当然,Yield()这样的 API 对于现代多线程、多进程的操作系统架构没有意义。因此,微软将其替换为空宏,试图实现编译级别的代码兼容性

有趣的是,在 .NET 4.5中以某种Yield()形式重生。其目的是在当前SynchronizationContext上(或在池线程上,如果没有同步上下文)推迟异步方法的继续 。其中有趣的部分是,Task.Yield()在 .NET 应用程序的主 UI 线程中使用实际上允许组织 Windows 3.x 必须提供的类似级别的协作多任务处理。

于 2013-09-20T08:14:42.290 回答