万金流
以码会友。 吾Q:578751655。 水平有限,轻喷,谢!
随笔 - 189,  文章 - 0,  评论 - 7,  阅读 - 14万

线程是程序能够规划的最小运算单位。

在系统支持(cpu、操作系统等)的情况下,几项不冲突的任务(指不使用共享资源或互相等待结果)使用多线程可以提高程序的执行效率。

如下例:

复制代码
class Program
    {
        static int sleeptime=1000, myvalue=100;
        static DateTime dt1,dt2;
        static void Main(string[] args)
        {
            Thread t1, t2;
            t1 = new Thread(new ThreadStart(add));
            t2 = new Thread(new ThreadStart(sub));
            dt1 = DateTime.Now;
            t1.Start();
            t2.Start();
            Thread.Sleep(3*sleeptime);
            Console.WriteLine("以下是单线程用时:");
            ///////////////////////////////////////
            dt1 = DateTime.Now;
            add();
            sub();
            dt2 = DateTime.Now;
            Console.WriteLine(dt2 - dt1);
            Console.ReadKey();
        }
        public static void add()
        {
            myvalue++;
            Thread.Sleep(sleeptime);
            Console.WriteLine(DateTime.Now - dt1);
        }
        public static void sub()
        {
            myvalue--;
            Thread.Sleep(sleeptime);
            Console.WriteLine(DateTime.Now - dt1);
        }
    }
复制代码

同样的操作,两种不同的方式。前者多线程,后者是默认的单线程。程序执行结果如下:

 

 

 可以看到效率的明显差异。

当然,这中间还有资源切换带来的损耗。如果每个方法足够复杂,执行的时间足够长,相信结果应当是线性的。

如果程序对某一部分资源进行争夺,使用“lock”对资源进行锁定可以杜绝很多不可控的情况。比如下面的代码:

复制代码
class Program
    {
        //因为lock只能锁定引用类型,所以这里用一个长度为1的一维数组来存放值。
        static int[] b= { 1000 };
        static int f;
        static void Main(string[] args)
        {
            Thread t1 = new Thread(new ThreadStart(add));
            Thread t2 = new Thread(new ThreadStart(sub));
            f = 1;
            t1.Start();
            t2.Start();
            Console.Read();
        }
        public static void add()
        {
            for (int i = 0; i < 1000; i++)
            {
                //lock (b)
                {
                    if (f == -1)
                    {
                        Console.Write("add\n");
                        f = 1;
                    }
                    Console.Write(++b[0] + ",");
                }
            }
        }
        public static void sub()
        {
            for (int i = 0; i < 1000; i++)
            {
                //lock (b)
                {
                    if (f == 1)
                    {
                        Console.Write("sub\n");
                        f = -1;
                    }
                    Console.Write(--b[0] + ",");
                }
            }
        }
    }
复制代码

运行后可以发现:不使用lock,加减处不平滑。

posted on   万金流  阅读(382)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现

点击右上角即可分享
微信分享提示