C# 不用lock写一个多线程程序

多线程并发

    当一段代码有可能被不止一个线程同时访问时,且存在共享资源(变量、文件句柄等),可能出现并发冲突。发生并发冲突时如果不加锁,程序的行为是不可预测的。而加锁本身又是一件麻烦事,弄不好会出现死锁,死锁时程序卡在那既没有异常也没有日志,找问题都无从下手。

    C#中通常会使用 lock 来加锁,这里应严格避免锁静态对象(如 lock(type)),避免 lock(this),这种锁的粒度都太大,容易出现死锁。

多线程程序不加锁的方法

第一,bool 类型是线程安全的,不需要锁

第二,整形, DateTime 类型可以用Interlocked

long lastTicks= DateTime.Now.Ticks;

private void multiThreadMethod()
{
    var l = Interlocked.Read(ref lastTicks);
    var lastTime = new DateTime(l);//读取上一时刻.
    //do work...

    Interlocked.Exchange(ref lastTicks, DateTime.Now.Ticks);//更新上一时刻.
}

 第三,多使用ConcurrentQuere, ConcurrentDictionary

 一个典型的数采驱动程序

    数采驱动通常需要做 接收-处理-转发 三步,为避免阻塞接收,接收后应该入队,由单独的线程完成处理、转发工作。可以设计两个类Driver, MessageHandler,Driver接受数据,MessageHandler入队处理后返回给Driver,再有Driver发送出去。

    Driver代码要关键要保持与数据源的链接,断开后能够自动重连,这部分大

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值