• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

c#原子操作

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

前言

在我们使用多线程的时候,我们会发现我们必须面临一个线程安全的问题,就是说多个线程操作同一个数据可能产生的问题是否得到解决。

对于异步线程,常常提及到锁这个概念,而我们知道锁是一个非常消耗性能的东西,而对于c# 是给我们封装了原子操作,对我们的锁进行了一些优化。在多线程的时候我们依然可以用原子操作来实现减少性能的损耗。

正文

代码如下:

static void TestCounter(CounterBase c)
	{
		for (int i = 0; i < 100000; i++)
		{
			c.increment();
			c.Decrement();
		}
	}
abstract class CounterBase {
	public abstract void increment();
	public abstract void Decrement();

}
class Counter : CounterBase
{
	private int _Count;
	public int Count => _Count;
   
	public override void increment()
	{
		//Console.WriteLine(CurrentThread.Name);
		_Count++;
	}
	public override void Decrement()
	{
		//Console.WriteLine(CurrentThread.Name);
		_Count--;
	}
}
class CounterWithLock : CounterBase
{


	private int _Count;
	public int Count => _Count;

	public override void increment()
	{
		Interlocked.Increment(ref _Count);
	}
	public override void Decrement()
	{
		Interlocked.Decrement(ref _Count);
	}
}

测试:

static void Main(string[] args)
{
	for (var i = 0; i < 100; i++)
	{
		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(c.Count);
		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(c1.Count);
	}
	Console.ReadKey();
}

结论

当我们使用原子操作的时候结果就为0,这个很好的解决了我们的死锁问题,因为只有原子操作完,其他线程才可以进行操作。

原子操作的原理

后续补齐


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
CodeforcesRound#449[C/A.Nephrengivesariddle][D/B.ItheaPlaysWithChtholly]发布时间:2022-07-13
下一篇:
创建一个简单的窗口(eclipsec++)发布时间:2022-07-13
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap