博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《C#多线程编程实战(原书第2版)》——2.10 使用SpinWait类
阅读量:7220 次
发布时间:2019-06-29

本文共 885 字,大约阅读时间需要 2 分钟。

本节书摘来自华章出版社《C#多线程编程实战(原书第2版)》一书中的第2章,第2.10节,作者(美)易格恩·阿格佛温(Eugene Agafonov),黄博文 黄辉兰 译,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

2.10 使用SpinWait类

本节将描述如何不使用内核模型的方式来使线程等待。另外,我们介绍了SpinWait,它是一个混合同步构造,被设计为使用用户模式等待一段时间,然后切换到内核模式以节省CPU时间。

2.10.1 准备工作

为了学习本节,你需要安装Visual Studio 2015。除此之外无需其他准备。本节的源代码放置在BookSamplesChapter2Recipe9目录中。

2.10.2 实现方式

请执行以下步骤来了解如何不借助于内核模式方法来实现线程等待:

1.启动Visual Studio 2015。新建一个C#控制台应用程序项目。

2.在Program.cs文件中加入以下using指令:

77daa55cc8301c24b971b22101c25afab6afa5c5

3.在Main方法下面加入以下代码片段:

b09422a182808312c3d24954eda4fb87eb01b450

4.在Main方法中加入以下代码片段:

2295c732f07c57c6fc2fba471b643a7093d083d9

5.运行程序。

2.10.3 工作原理

当主程序启动时,定义了一个线程,将执行一个无止境的循环,直到20毫秒后主线程设置_isCompleted变量为true。我们可以试验运行该周期为20~30秒,通过Windows任务管理器测量CPU的负载情况。取决于CPU内核数量,任务管理器将显示一个显著的处理时间。

我们使用volatile关键字来声明_isCompleted静态字段。Volatile关键字指出一个字段可能会被同时执行的多个线程修改。声明为volatile的字段不会被编译器和处理器优化为只能被单个线程访问。这确保了该字段总是最新的值。

然后我们使用了SpinWait版本,用于在每个迭代打印一个特殊标志位来显示线程是否切换为阻塞状态。运行该线程5毫秒来查看结果。刚开始,SpinWait尝试使用用户模式,在9个迭代后,开始切换线程为阻塞状态。如果尝试测量该版本的CPU负载,在Windows任务管理器将不会看到任何CPU的使用。

转载地址:http://zmiym.baihongyu.com/

你可能感兴趣的文章
Algernon's Noxious Emissions POJ1121 zoj1052
查看>>
iOS-数据持久化-对象归档
查看>>
iOS开发UI篇—程序启动原理和UIApplication
查看>>
MUI 里js动态添加数字输入框后,增加、减少按钮无效
查看>>
python pip 更换国内安装源(windows)
查看>>
结对编程2后篇
查看>>
oracle exp 和 imp 数据和表结构互相独立导出导入
查看>>
iphone-common-codes-ccteam源代码 CCNSPredicate.m
查看>>
这次项目中应该注意的问题和应该保持的好习惯
查看>>
python-数据结构化与保存
查看>>
LeetCode - 551. Student Attendance Record I
查看>>
Java用户线程和守护线程
查看>>
ClassLoader类加载机制&&JVM内存管理
查看>>
Caml语句 查询分配给当前用户及当前组
查看>>
记一次源码分析
查看>>
php版本引起的const问题
查看>>
js实现60s倒计时效果
查看>>
【POJ 2176】Folding
查看>>
redis的过期策略以及内存淘汰机制
查看>>
阿牛的EOF牛肉串
查看>>