本节书摘来自华章出版社《c#多线程编程实战(原书第2版)》一书中的第2章,第2.10节,作者(美)易格恩·阿格佛温(eugene agafonov),黄博文 黄辉兰 译,更多章节内容可以访问云栖社区“华章计算机”公众号查看。
本节将描述如何不使用内核模型的方式来使线程等待。另外,我们介绍了spinwait,它是一个混合同步构造,被设计为使用用户模式等待一段时间,然后切换到内核模式以节省cpu时间。
为了学习本节,你需要安装visual studio 2015。除此之外无需其他准备。本节的源代码放置在booksampleschapter2recipe9目录中。
请执行以下步骤来了解如何不借助于内核模式方法来实现线程等待:
1.启动visual studio 2015。新建一个c#控制台应用程序项目。
2.在program.cs文件中加入以下using指令:

3.在main方法下面加入以下代码片段:
4.在main方法中加入以下代码片段:
5.运行程序。
当主程序启动时,定义了一个线程,将执行一个无止境的循环,直到20毫秒后主线程设置_iscompleted变量为true。我们可以试验运行该周期为20~30秒,通过windows任务管理器测量cpu的负载情况。取决于cpu内核数量,任务管理器将显示一个显著的处理时间。
我们使用volatile关键字来声明_iscompleted静态字段。volatile关键字指出一个字段可能会被同时执行的多个线程修改。声明为volatile的字段不会被编译器和处理器优化为只能被单个线程访问。这确保了该字段总是最新的值。
然后我们使用了spinwait版本,用于在每个迭代打印一个特殊标志位来显示线程是否切换为阻塞状态。运行该线程5毫秒来查看结果。刚开始,spinwait尝试使用用户模式,在9个迭代后,开始切换线程为阻塞状态。如果尝试测量该版本的cpu负载,在windows任务管理器将不会看到任何cpu的使用。