C# 中线程资源访问互斥锁
2016-02-28 22:02
477 查看
一个加减数值的例子说明问题
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();
}
}
}
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();
}
}
}
相关文章推荐
- C#基础—变量、常量
- C#学习(8):类型约束
- 委托和方法的异步调用
- C#编程基础—数据类型
- 用C#将Word转化成PDF 报错“由于出现意外错误,导出失败”解决方案
- C# 文档注释规范
- C#找梅森素数
- C#交互功能的演化
- C# winform DatagridView 的简单操作
- C#找质数(素数)
- c#如何采集需要登录的页面
- C# 反射详解
- C# 反射详解
- C# 命名规范
- C#WinForm打开文件夹并选中文件
- C#demo程序 调用自己编写的DLL
- C#委托
- C# 动态加载程序集dll (实现接口)
- C#生成exe、dll版本号自动增加
- C# AD(Active Directory)域信息同步,组织单位、用户等信息查询