在第 97 行的头文件中有一个奇怪的类似函数的宏,winbase.h
如下所示:
#define Yield()
这是为了什么?
在第 97 行的头文件中有一个奇怪的类似函数的宏,winbase.h
如下所示:
#define Yield()
这是为了什么?
Windows 3.x 使用协作多任务模型。所有应用程序(也称为“任务”)曾经在单个线程上的相同内存空间中运行。通常,任务之间的切换是由GetMessage
应用程序主消息循环中的 API 执行的。Yield()
曾经是自愿切换到另一个应用程序的方式(例如,如果进行冗长的 CPU 密集型处理)。这是一篇相关的 MSKB 文章,它仍然存在。
当然,Yield()
这样的 API 对于现代多线程、多进程的操作系统架构没有意义。因此,微软将其替换为空宏,试图实现编译级别的代码兼容性。
有趣的是,在 .NET 4.5中以某种Yield()
形式重生。其目的是在当前SynchronizationContext上(或在池线程上,如果没有同步上下文)推迟异步方法的继续 。其中有趣的部分是,Task.Yield()
在 .NET 应用程序的主 UI 线程中使用实际上允许组织 Windows 3.x 必须提供的类似级别的协作多任务处理。