C#线程系列讲座(4):同步与死锁

虽然线程可以在一定程度上提高程序运行的效率,但也会产生一些副作用。让 我们先看看如下的代码:

class Increment    {        private int n = 0;        private int max;        public Increment(int max)        {            this.max = max;        }        public int result        {            get            {                return n;            }            set            {                n = value;            }        }        public void Inc()        {                        for (int i = 0; i < max; i++)            {                n++;            }        }    }    class Program    {        public static void Main()        {            Increment inc = new Increment(10000);            Thread[] threads = new Thread[30];            for (int i = 0; i < threads.Length; i++)            {                threads[i] = new Thread(inc.Inc);                threads[i].Start();            }            for (int i = 0; i < threads.Length; i++)            {                threads[i].Join();  // 等待30个线程都执行完            }            Console.WriteLine(inc.result);  //输出n的值        }    }

上面的程序的基本功能是使用Increment的Inc方法为n递 增max,所不同的是,将在Main方法中启动30个线程同时执行Inc方法。在本例中 max的值是10000(通过Increment的构造方法传入)。读者可以运行一下这个程序 ,正常的结果应该是300000,但通常不会得到这个结果,一般获得的结果都比 300000小。其中的原因就是Inc方法中的n++上,虽然从表面上看,n++只是一条简 单的自增语言,但从底层分析,n++的IL代码如下:

ldsfld// 获得n的初 始值,并压到方法栈中

ldc.i4.1// 将1压到方法栈中

add// 从方 法栈中弹出最顶端的两个值,相加,然后将结果保存在方法栈中

stfld// 从当前方法栈中弹出一个值,并更新类字段n

对于上面每一条IL语句是线 程安全的,但是n++这条C#语句需要上面的四步才能完成,因此,n++这条语句并 不是线程安全的。只要在执行stfld指令之前的任何一步由于其他线程获得CPU而 中断,那么就会出现所谓的“脏”数据。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索c#
, int
, 线程
, 方法
, max
Increment
c站、c语言、cf、ch、c罗,以便于您获取更多的相关知识。

时间: 2024-09-17 04:08:26

C#线程系列讲座(4):同步与死锁的相关文章

C#线程系列讲座(5):同步技术之Monitor

在上一讲介绍了使用lock来实现线程之间的同步.实际上,这个lock是C#的一 个障眼法,在C#编译器编译lock语句时,将其编译成了调用Monitor类.先看看下 面的C#源代码: public static void MyLock(){ lock (typeof(Program)) { }} 上面的 代码通过lock语句使MyLock同步,这个方法被编译成IL后,代码如图1所示. 图1 从上图被标注的区域可以看到,一条lock语句被编译成了调 用Monitor的Enter和Exit方法.Mo

C#线程系列讲座(1):BeginInvoke和EndInvoke方法

开发语言:C#3.0 IDE:Visual Studio 2008 本系列教程主要包括如下内容: 1. BeginInvoke和EndInvoke方法 2. Thread类 3.线程池 4.线程同步基础 5.死锁 6.线程同步的7种方法 7.如何在线程中访问GUI组件 一.线程概述 在操作系统中一个进程至少要包含一个线程,然后,在某些时候需要在同一个进程中同时执行多项任务,或是为了提供程序的性能,将要执行的任务分解成多个子任务执行.这就需要在同一个进程中开启多个线程.我们使用C#编写一个应用程序

C#线程系列讲座(3):线程池和文件下载服务器

如果设计一个服务器程序,每当处理用户请求时,都开始一个线程,将会在一 定程序上消耗服务器的资源.为此,一个最好的解决方法就是在服务器启动之前 ,事先创建一些线程对象,然后,当处理客户端请求时,就从这些建好的线程中 获得线程对象,并处理请求.保存这些线程对象的结构就叫做线程池. 在C#中可以通过System.Threading.ThreadPool类来实现,在默认情况下, ThreadPool最大可建立500个工作线程和1000个I/O线程(根据机器CPU个数和.net framework版本的不

C#线程系列讲座(2):Thread类的应用

一.Thread类的基本用法 通过System.Threading.Thread类可以开始新 的线程,并在线程堆栈中运行静态或实例方法.可以通过Thread类的的构造方法 传递一个无参数,并且不返回值(返回void)的委托(ThreadStart),这个委托的 定义如下: [ComVisibleAttribute(true)] public delegate void ThreadStart() 我们可以通过如下的方法来建立并运行一个 线程. using System;using System.

资深网站运营总监“莫言”的网站运营系列讲座(一)

网站运营 主讲:莫言主题:网站运营系列讲座(一) 讲课记录: 运营一个网站,咱们还是先从自身资源开始谈 自身资源里,包括了人员,资金,你的站所处领域里你对业务的熟悉程度 当然也包括一些硬件资源 类似服务器,或者空间 带宽 这些都是需要你前期考虑好的,并辅助与实施的 这里,要着重提的是你做站一定要选自己熟悉的行业领域 引一句话"不要拿自己的弱项跟人家的强项拼" 选择自己熟悉,或者说正在从事的领域行业来做站这是首选的 还包括你领域里可以整合其他的小范围领域 这些..可以统称为"网

HDwiki系列讲座第九期: 网络广告联盟广告投放技巧

中介交易 SEO诊断 淘宝客 云主机 技术大厅 大家好,很荣幸能担任本次讲座的嘉宾,由于讲座的主题是"网络广告联盟广告投放技巧",所以,我还是要先给大家简单介绍一下什么是网络广告联盟. 下面开始进入主题 一.什么是网络广告联盟 网络广告联盟,又称联盟营销,指集合中小网络媒体资源(又称联盟会员,如中小网站.个人网站.WAP 站点等)组成联盟,通过联盟平台帮助广告主实现广告投放,并进行广告投放数据监测统计, 广告主则按照网络广告的实际效果向联盟会员支付广告费用的网络广告组织投放形式. 网络

如何在普通类实例的线程过程中,同步调用执行在类实例自身所在的原来的那个线程中的方法

问题描述 如何在普通类实例的线程过程中,同步调用执行在类实例自身所在的原来的那个线程中的方法如后代码,是一个常见的实例,讲的是通过Control.Invoke在线程函数中,同步调用窗体主线程中的Form1实例的普通方法txt.但问题是,很多时候我们自己自定义的类,并不是从Control类继承的,从而也没有这个功能的Invoke方法供调用,这种类要怎么设计呢?虽然说用的示例代码是vb.net的,但严格来说,这个和语言无关,是一个.net开发的基本问题.ImportsSystemImportsSys

进程、线程知识点总结和同步(消费者生产者,读者写者三类问题)、互斥、异步、并发、并行、死锁、活锁的总结

进程和程序: 进程:是个动态的概念,指的是一个静态的程序对某个数据集的一次运行活动,而程序是静态的概念,是由代码和数据组成的程序块而已. 进程5大特点:动态性,并发性,独立运行性,异步性,和结构化的特性. 在多道程序环境下,程序不能独立运行,操作系统所有的特征都是基于进程而体现的,只有进程可以在系统中运行,程序运行必须有进程才行.进程是操作系统里资源分配的基本单位,也是独立运行的基本单位,具有动态的特点,暂时出现的特点,而且一个进程产生之后,可以再次生成多个进程出来.也可以多个进程并发执行,也可

Java线程系列

Java线程:线程私有变量 Java线程:深入ThreadLocal Java线程:线程的调度-休眠 Java线程:线程的调度-优先级 Java线程:线程的调度-让步 Java线程:线程的调度-合并 Java线程:线程的调度-守护线程 Java线程:线程的同步-同步方法 Java线程:线程的同步-同步块 Java线程:并发协作-生产者消费者模型 Java线程:并发协作-死锁 Java线程:volatile关键字 Java线程:新特征-线程池 Java线程:新特征-有返回值的线程 Java线程:新