C#多线程同步lock、Mutex的实现

 更新时间:2024年05月30日 09:02:51   作者:猪猪加大码力  
本文主要介绍了C#多线程同步lock、Mutex的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

C#使用多线程可以通过System.Threading命名空间下的Thread类来实现

lock和Mutex用于实现线程同步的机制:

上代码:

    class People
    {
        public People(int idd)
        {
            id = idd;
        }
        public int id;
        public int age;
    }
    class TestHelper
    {
        public TestHelper() { }
        List<People> m_data = new List<People>();

        int m_iComplete;
        private void LockThread(object obj)
        {
            List<object> parameters = (List<object>)obj;
            int idx = (int)parameters[0];
            while (true)
            {
                People data = null;
                lock(this)
                {
                    if (m_iComplete >= m_data.Count)
                    {
                        return;
                    }
                    data = m_data[m_iComplete];
                    Interlocked.Increment(ref m_iComplete);

                    data.age = data.id;
                    Console.Write("======");
                    Console.WriteLine("id:" + data.id.ToString() + ",age:" + data.age.ToString());
                }

            }
        }

        //测试lock
        public void TestLock()
        {
            DateTime time1 = DateTime.Now;
            m_iComplete = 0;
            m_data.Clear();
            for (int i = 0; i < 10000;i++)
            {
                m_data.Add(new People(i + 1));
            }
            List<Thread> threads = new List<Thread>();
            for (int i = 0; i < Environment.ProcessorCount; i++)
            {
                Thread th = new Thread(LockThread);
                th.IsBackground = true;
                List<object> objs = new List<object>();
                objs.Add(i + 1);
                th.Start(objs);
                threads.Add(th);
            }
            foreach (var th in threads)
            {
                th.Join();
            }
            DateTime time2 = DateTime.Now;
            TimeSpan deltaTime = time2.Subtract(time1);
            Console.Write("===================耗时: ");
            Console.WriteLine(deltaTime.TotalSeconds);
        }

        Mutex m_mutex = new Mutex();
        private void MutexThread(object obj)
        {
            List<object> parameters = (List<object>)obj;
            int idx = (int)parameters[0];
            while (true)
            {
                People data = null;
                //开启
                m_mutex.WaitOne();
                if (m_iComplete >= m_data.Count)
                {
                    //释放
                    m_mutex.ReleaseMutex();
                    return;
                }
                data = m_data[m_iComplete];

                Interlocked.Increment(ref m_iComplete);
                data.age = data.id;
                Console.Write("======");
                Console.WriteLine("id:" + data.id.ToString() + ",age:" + data.age.ToString());
                //释放
                m_mutex.ReleaseMutex();
            }
        }
        //测试mutex
        public void TestMutex()
        {
            DateTime time1 = DateTime.Now;
            m_iComplete = 0;
            m_data.Clear();
            for (int i = 0; i < 10000; i++)
            {
                m_data.Add(new People(i + 1));
            }
            List<Thread> threads = new List<Thread>();
            for (int i = 0;i<Environment.ProcessorCount;i++)
            {
                Thread th = new Thread(MutexThread);
                List<object> objs = new List<object>();
                objs.Add(i + 1);
                th.Start(objs);
                threads.Add(th);                
            }
            foreach(var th in threads)
            {
            	//同步等待
                th.Join();
            }
            DateTime time2 = DateTime.Now;
            TimeSpan deltaTime = time2.Subtract(time1);
            int sec = (int)deltaTime.TotalSeconds;
            Console.Write("===================耗时: ");
            Console.WriteLine(deltaTime.TotalSeconds);
        }
    }

测试:

在这里插入图片描述

起多个线程计算:

在这里插入图片描述

总结:

1、Lock是C#中的关键字,用于对代码块进行同步。Lock只能用于同一进程内的线程同步。轻量级的同步机制,开销比较小,使用简单,不能用于跨应用程序域的线程同步。
2、Mutex是系统级别的同步对象,用于跨进程的线程同步。 Mutex是内核对象,因此创建和销毁代价高,用于跨应用程序域的线程同步。

到此这篇关于C#多线程同步lock、Mutex的实现的文章就介绍到这了,更多相关C#多线程同步lock、Mutex内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C#实现DataTable转换成IList的方法

    C#实现DataTable转换成IList的方法

    这篇文章主要介绍了C#实现DataTable转换成IList的方法,涉及C#针对DataTable操作的相关技巧,需要的朋友可以参考下
    2016-03-03
  • unity中点击某一个按钮播放某一个动作的操作

    unity中点击某一个按钮播放某一个动作的操作

    这篇文章主要介绍了unity中点击某一个按钮播放某一个动作的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • Unity实现首字母检索器

    Unity实现首字母检索器

    这篇文章主要为大家详细介绍了Unity实现首字母检索器,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-11-11
  • C#入门教程之集合ArrayList用法详解

    C#入门教程之集合ArrayList用法详解

    这篇文章主要介绍了C#入门教程之集合ArrayList用法,结合具体实例分析了C#中集合的概念、功能、创建与使用方法,需要的朋友可以参考下
    2017-06-06
  • C#对图片进行马赛克处理可控制模糊程度的实现代码

    C#对图片进行马赛克处理可控制模糊程度的实现代码

    本文通过实例代码给大家介绍了C#对图片进行马赛克处理可控制模糊程度的实现方法,代码超简单,具有一定的参考借鉴价值,感兴趣的朋友跟随脚本之家小编一起学习吧
    2018-05-05
  • C#开发微信门户及应用(1) 微信接口使用

    C#开发微信门户及应用(1) 微信接口使用

    这篇文章主要为大家详细介绍了C#开发微信门户及应用第一篇,微信接口的使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • C#中使用Join与GroupJoin将两个集合进行关联与分组

    C#中使用Join与GroupJoin将两个集合进行关联与分组

    这篇文章主要介绍了C#中使用Join与GroupJoin将两个集合进行关联与分组,文中分别对Join和GroupJoin的用法进行详细说明,需要的朋友可以参考下
    2017-12-12
  • C#通过XML节点属性/属性值读取写入XML操作代码实例

    C#通过XML节点属性/属性值读取写入XML操作代码实例

    本文主要介绍C#通过XML节点属性、属性值对XML的读取,写入操作,大家参考使用吧
    2013-11-11
  • C#实现以管理员方式启动程序的多种方法

    C#实现以管理员方式启动程序的多种方法

    在Windows应用程序开发的领域中,C#语言凭借其强大的功能和广泛的适用性,被众多开发者所青睐,然而,在实际的开发过程里,我们常常会遭遇程序需要访问特定的系统资源,像是系统文件夹、注册表项等,在接下来的内容中,我将为大家介绍在C#中实现以管理员方式启动程序的多种方法
    2025-01-01
  • C# 对象映射的高性能方案

    C# 对象映射的高性能方案

    这篇文章主要介绍了C# 对象映射的高性能方案,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,有需要的朋友可以借鉴参考下
    2020-12-12

最新评论