《C#多线程编程实战(原书第2版)》——2.2 执行基本的原子操作

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

2.2 执行基本的原子操作

本节将展示如何对对象执行基本的原子操作,从而不用阻塞线程就可避免竞争条件。

2.2.1 准备工作

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

2.2.2 实现方式

请执行以下的步骤来了解基本的原子操作:

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

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


03e5c774185bea42a89c5cc24628e523465af816

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


393924a75c7d69b690979ac902f79c15fab6ae8f


f99a3f2530b11c61105f585eb0f46e72095ce6ef

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


f28227d96581746eaff9fc17407354a653a09706

5.运行程序。

2.2.3 工作原理

当程序运行时,会创建三个线程来运行TestCounter方法中的代码。该方法对一个对象按序执行了递增或递减操作。起初的Counter对象不是线程安全的,我们会遇到竞争条件。所以第一个例子中计数器的结果值是不确定的。我们可能会得到数字0。然而如果运行程序多次,你将最终得到一些不正确的非零结果。

在第1章中,我们通过锁定对象解决了这个问题。在一个线程获取旧的计数器值并计算后赋予新的值之前,其他线程都被阻塞了。然而,如果我们采用上述方式执行该操作,中途不能停止。而借助于Interlocked类,我们无需锁定任何对象即可获取到正确的结果。Interlocked提供了Increment、Decrement和Add等基本数学操作的原子方法,从而帮助我们在编写Counter类时无需使用锁。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值