C# 中线程资源访问互斥锁
来源:互联网 发布:用一套好还是用淘宝好 编辑:程序博客网 时间:2024/04/29 09:43
一个加减数值的例子说明问题
using System;using System.Threading;namespace ThreadLockingDemo{ class Program { static void Main(string[] args) { Console.WriteLine("incorrect counter"); var c = new Counter(); var t1 = new Thread(() => TestCounter(c)); var t2 = new Thread(() => TestCounter(c)); var t3 = new Thread(() => TestCounter(c)); t1.Start(); t2.Start(); t3.Start(); t1.Join(); t2.Join(); t3.Join(); //每次运行的结果都是未知情况 Console.WriteLine("total count: {0}", c.Count); Console.WriteLine("----------------"); Console.WriteLine("correct counter"); var c1 = new CounterWithLock(); t1 = new Thread(() => TestCounter(c1)); t2 = new Thread(() => TestCounter(c1)); t3 = new Thread(() => TestCounter(c1)); t1.Start(); t2.Start(); t3.Start(); t1.Join(); t2.Join(); t3.Join(); //返回结果确定 Console.WriteLine("total count: {0}", c1.Count); Console.ReadKey(); } static void TestCounter(CounterBase c) { for(int i = 0; i <100000;i++) { c.Increment(); c.Decrement(); } } class Counter : CounterBase { public int Count { get; private set; } //没有对count作线程方案保护 public override void Decrement() { Count--; } public override void Increment() { Count++; } } class CounterWithLock : CounterBase { private readonly object _syncRoot = new Object(); public int Count { get; private set; } public override void Decrement() { lock(_syncRoot) { Count--; } } public override void Increment() { lock (_syncRoot) { Count++; } } } abstract class CounterBase { public abstract void Increment(); public abstract void Decrement(); } }}
如果是仅是对数值进行互斥保护C#还提供了另一种现成的方案
using System;using System.Threading;namespace AtomicOperation{ class Program { static void Main(string[] args) { Console.WriteLine("incorrect counter"); var c = new Counter(); var t1 = new Thread(() => TestCounter(c)); var t2 = new Thread(() => TestCounter(c)); var t3 = new Thread(() => TestCounter(c)); t1.Start(); t2.Start(); t3.Start(); //主线程等待三个线程全部结束 t1.Join(); t2.Join(); t3.Join(); Console.WriteLine("total count:{0}", c.Count); Console.WriteLine("-------------------------"); Console.WriteLine("correct counter"); var c1 = new CounterNoLock(); t1 = new Thread(() => TestCounter(c)); t2 = new Thread(() => TestCounter(c)); t3 = new Thread(() => TestCounter(c)); t1.Start(); t2.Start(); t3.Start(); t1.Join(); t2.Join(); t3.Join(); Console.WriteLine("total count:{0}", c1.Count); Console.ReadKey(); } static void TestCounter(CounterBase c) { Console.WriteLine("thread id {0}", Thread.CurrentThread.ManagedThreadId); for (int i =0; i< 10000; i++) { c.Increament(); c.Decreament(); } } class Counter:CounterBase { private int _count; public int Count { get { return _count; } } public override void Decreament() { _count--; } public override void Increament() { _count++; } } class CounterNoLock:CounterBase { private int _count; public int Count { get { return _count; } } public override void Decreament() { Interlocked.Increment(ref _count); } public override void Increament() { Interlocked.Decrement(ref _count); } } abstract class CounterBase { public abstract void Increament(); public abstract void Decreament(); } }}
0 0
- C# 中线程资源访问互斥锁
- C# 中线程资源访问互斥量
- C#线程中访问控件
- C# 在线程中访问控件
- C# 在线程中访问控件
- Java中怎么控制线程访问资源的数量
- C#访问远程资源
- C#线程资源总结
- C# 线程访问控件
- C#跨线程访问
- 进程与线程(四)线程中访问资源的同步
- c#中线程访问winform控件的若干问题
- C#中跨线程访问控件问题解决方案
- 转:c#中线程访问winform控件的若干问题
- C# vb.net 线程中安全的使访问示例
- C#中跨线程访问控件问题解决方案
- 转:C#中跨线程访问控件问题解决方案
- c# winform开发 从线程中访问控件
- android studio 程序真机运行中文显示乱码
- 基于彻底解耦合的实验性iOS架构
- 关于Android数据库升级的实践(以ormlite为例)
- love
- java ee 13种技术
- C# 中线程资源访问互斥锁
- Data Structures And Problem Solving Using Java (Fourth Edition)中译版(Java static关键字)
- 该不该和教师一起去做项目
- 本机与虚拟机中的Ubuntu传递文件 (待完善)
- UIControl 的基本使用方法和 Target-Action 机制
- android下使用gzip压缩提升访问server api的效率
- 2016关键词
- Python图像处理库PIL的ImageFont模块介绍
- 算法代码实现之归并排序,C/C++实现,自顶向下与自底向上两种方式