C# 中多线程锁的使用经验

这篇具有很好参考价值的文章主要介绍了C# 中多线程锁的使用经验。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

C# 中多线程锁的使用经验:全局锁,实例锁

全局锁

        private static object _exeLock = new object();

       static 静态的是全应用程序的资源。如果在一个类里定义了这样一个锁,你在调用使用这个类的时候,是NEW了一个对象,并把这个对象给了一个静态全局变量中保存。这时这个锁就是全局锁了。

        你在调用带锁的方法时会受到【全局锁】的影响。

实例锁

        private object _exeLock = new object();

        影响只在这个对象实例中。

示例

全局锁代码

类的代码

/// <summary>
/// 雷赛板卡 AxisDMC3000
/// </summary>
public class DMC3000 : AxisModel
{
    public DMC3000() { }

    public DMC3000(string name) { }

    /// <summary>
    /// 全局锁
    /// </summary>
    private static object _exeLockAll = new object();

    /// <summary>
    /// 对象锁
    /// </summary>
    //private object _exeLock = new object();

    /// <summary>
    /// 移动到指定位置
    /// </summary>
    /// <param name="posname">位置名称</param>
    /// <returns></returns>
    public override bool MoveAbs(string posname)
    {
        var isFinsh = false;
        lock (_exeLockAll)
        {
            try
            {
                int dis = (int)(GetAxisPosList(posname) * Param.PulseRatio);
                SetAxisParam();
                //单轴运动函数
                //Dist 目标位置,单位:pulse,范围:-134217728~+134217728
                //posi_mode 运动模式,0:相对坐标模式,1:绝对坐标模式
                isFinsh = LTDMC.dmc_pmove(CardNum, AxisNum, dis, 1) == 0;
            }
            catch (Exception ex)
            {
                isFinsh = false;
                WorkFlow.ShowMsgError("MoveAbs(string posname) 异常:" + ex.Message,
                    "MoveAbs(string posname)");
            }
        }
        return isFinsh;
    }
}

上面的代码中有一个【全局锁】和一个用了【全局锁】的方法

调用这个类时的代码

创建两个类对象

#region 轴
/// <summary>
/// (焊接)X轴 左右移动X轴
/// </summary>
private static DMC3000 _axis_CarryX;

/// <summary>
/// (焊接)Y轴 前后移动Y轴
/// </summary>        
private static DMC3000 _axis_CarryY;//Axis_CarryY = 1,

/// <summary>
/// 送针X 左右移动
/// </summary>
private static DMC3000 _axis_SongzhengX;
#endregion

/// <summary>
/// 初始化 轴
/// </summary>
/// <returns></returns>
public static bool InitAxis()
{
    var isFinish = false;
    _axis_CarryX = new DMC3000(AxisType.Axis_CarryX.ToString());
    _axis_CarryY = new DMC3000(AxisType.Axis_CarryY.ToString());
    _axis_SongzhengX = new DMC3000(AxisType.Axis_SongzhengX.ToString());
    return isFinish;
}

上面三个轴都是new的方式生成是三个独立的对象。

但在用线程Task调用MoveAbs方法时你会发现,三个轴的运动情况是一个一个的移动。而不是同时移动的

public static void Test()
{
    Task.Factory.StartNew(() => {
        _axis_CarryX.MoveAbs("ToPos");
    });
    Task.Factory.StartNew(() => {
        _axis_CarryY.MoveAbs("ToPos");
    });
    Task.Factory.StartNew(() => {
        _axis_SongzhengX.MoveAbs("ToPos");
    });
}

原因就是对象里使用对【全局锁】每个对象在调用MoveAbs方法时都会进行排对,第一个线程用完后,第二个线程去用。以此类推。这像就相对于是单线程了,上面开了三个线程去执行,完全没有用和不用Task调用是一样的。这样的效果一定不是我们所希望的。那要怎么解决这个问题呢。

        有人可能会说那就不用锁了。这样不是解决问题了吗?这也是一种解决方法。但我在工作中。发现一个问题就是在不用锁时发现有时轴无法走到指定的点位。在获取轴当前的坐标时也不是我们指定的坐标位。本文就是为解决这个时而出现的多线程问题而写的总结。

        为了达到同步效果又要解决一个轴在多个线程中有调用的情况时。我选择了【对象锁】解决问题。【对象锁】从名称中就可以知道,这锁的范围在对象中,不会影响到其他对象的的调用。这样就可以解决问题。多线程中同时调用MoveAbs方法时进行锁排对,执行和取读当前坐标不会因为多线程为影响。

实例锁代码

/// <summary>
/// 雷赛板卡 AxisDMC3000
/// </summary>
public class DMC3000 : AxisModel
{
    public DMC3000() { }

    public DMC3000(string name) { }

    /// <summary>
    /// 对象锁
    /// </summary>
    private object _exeLock = new object();

    /// <summary>
    /// 移动到指定位置
    /// </summary>
    /// <param name="posname">位置名称</param>
    /// <returns></returns>
    public override bool MoveAbs(string posname)
    {
        var isFinsh = false;
        lock (_exeLock)
        {
            try
            {
                int dis = (int)(GetAxisPosList(posname) * Param.PulseRatio);
                SetAxisParam();
                //单轴运动函数
                //Dist 目标位置,单位:pulse,范围:-134217728~+134217728
                //posi_mode 运动模式,0:相对坐标模式,1:绝对坐标模式
                isFinsh = LTDMC.dmc_pmove(CardNum, AxisNum, dis, 1) == 0;
            }
            catch (Exception ex)
            {
                isFinsh = false;
                WorkFlow.ShowMsgError("MoveAbs(string posname) 异常:" + ex.Message,
                    "MoveAbs(string posname)");
            }
        }
        return isFinsh;
    }
}

代码差别不大就中对像锁中没有使用static关键字。文章来源地址https://www.toymoban.com/news/detail-839633.html

到了这里,关于C# 中多线程锁的使用经验的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【JAVAEE学习】探究Java中多线程的使用和重点及考点

    ˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好,我是xiaoxie.希望你看完之后,有不足之处请多多谅解,让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN 如需转载还请通知˶⍤⃝˶​ 个人主页:xiaoxieʕ̯

    2024年04月15日
    浏览(26)
  • 多线程Synchronized锁的使用与线程之间的通讯

    多线程同时对同一个全局变量做写操作,可能会受到其他线程的干扰,就会发生线程安全问题。 Java中的全局变量是存放在堆内存中的,而堆内容对于所有线程来说是共享的。 比如下面一个简单的代码案例: 代码比较简单,我们看下面控制台的打印: 可以看到两个线程之间

    2024年02月04日
    浏览(30)
  • C# | 上位机开发新手指南(二)上位机通信

    在上位机开发中,串口通信和TCP通信是两种常见的通信方式。串口通信是指通过串口将数据发送和接收到控制器或其他外设中,TCP通信则是通过网络将数据传输到远程设备中。下面介绍一下为什么学习串口通信和TCP通信在上位机开发中是很重要的。 在许多工业自动化控制系统

    2024年02月07日
    浏览(29)
  • C#上位机开发目录

    C#上位机序列1: 多线程(线程同步,事件触发,信号量,互斥锁,共享内存,消息队列) C#上位机序列2: 同步异步(async、await) C#上位机序列3: 流程控制(串行,并行,混合) C#上位机序列4: 动画效果(模拟PLC设备运行) C#上位机序列5: 三菱通信(FX-3U SerialOverTcp) C#上位机序列

    2024年02月09日
    浏览(33)
  • java中多线程去跑海量数据使用线程池批量ThreadPoolExecutor处理的方式和使用Fork/Join框架的方式那种效率高?

    在Java中,使用线程池(ThreadPoolExecutor)和使用Fork/Join框架来处理海量数据的效率取决于具体的应用场景和需求。下面是一些需要考虑的因素: 任务类型:如果任务是CPU密集型的,那么使用Fork/Join框架可能更高效,因为它可以自动进行任务分割和并行处理。如果任务是I/O密集

    2024年02月10日
    浏览(38)
  • C# WPF上位机开发(键盘绘图控制)

    【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】         在软件开发中,如果存在canvas图像的话,一般有几种控制方法。一种是鼠标控制;一种是键盘控制;还有一种是定时器控制。定时器控制,多常见动画、游戏、3d视频当中。而鼠标控制

    2024年02月02日
    浏览(32)
  • C# 三菱PLC上位机开发环境搭建

    一、安装软件 用到两个三菱的软件: 1. MX Component(下载地址 也可以直接在官网上搜索,注意MX后面有空格) 用于连接PLC 2. GX Works2(下载地址 用GX Works3也行) 这个软件主要是电气做PLC编程,我们用来作为仿真,省去开发时摆弄真实PLC 序列号:117-570766844 二、配置软件 MX

    2023年04月18日
    浏览(35)
  • C# | 上位机开发新手指南(一)概述

    C#,是微软主推的编程语言。它在工业控制、自动化、物联网等领域应用非常广泛。由于国内在工业控制领域技术发展路径的原因,早期的自动化控制面板由Window环境提供,大量的MFC、VB6控制应用被部署在了工厂车间。在用户习惯和界面环境的双料加持下,给C#在工业领域的推

    2024年02月03日
    浏览(63)
  • C# 上位机之海康相机开发(SDK)

    发现工作中好多计算机视觉上位机项目都用海康相机,为了能够更好的学习和工作,我自己依据同事的源码和网上的一些总结编写本博客。通过本次学习,让我明白一点,无论学习什么技术都要学会自己看技术文档,而不是第一时间上网找源码。以工业相机SDK使用说明.chm为例

    2024年02月03日
    浏览(40)
  • C# WPF上位机开发(Web API联调)

    【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】         很多时候,客户需要开发的不仅仅是一个上位机系统,它还有其他很多配套的系统或设备,比如物流小车、立库、数字孪生等一整套系统。这个时候,上位机系统就需要和各个子系统

    2024年01月20日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包