• 说说Thread.Sleep(0)的那些奇怪的事


    写在前面

    最近在弄一个传输组件,用到很多多线程的知识,其中有个问题,困扰我很久,不知道是什么原因,脑子一热,在传输过程中,添加了一句代码Thread.Sleep(0)。那个问题竟然解决了,耗费我一上午的时间,一点一点的排查是不是代码逻辑有问题。到最后一句话解决了,兴奋归兴奋,但是为什么这句话就能解决我的问题呢?而且还是睡个0,是不是你也遇到过这种情况?不妨一起讨论下这句神奇的代码!

    Thread.Sleep(0)妙解

    这里收集了网上的一篇文章,解释的非常有趣,转载在博客中,也推荐给大家一起看看。

    [转载]Thread.Sleep(0)妙用

    摘录文章的几段话,你也可以有个大概的概念。

    操作系统中,CPU竞争有很多种策略。Unix系统使用的是时间片算法,而Windows则属于抢占式的。

    • 在时间片算法中,所有的进程排成一个队列。操作系统按照他们的顺序,给每个进程分配一段时间,即该进程允许运行的时间。如果在 时间片结束时进程还在运行,则CPU将被剥夺并分配给另一个进程。如果进程在时间片结束前阻塞或结束,则CPU当即进行切换。调度程序所要做的就是维护一张就绪进程列表,当进程用完它的时间片后,它被移到队列的末尾。
    • 所谓抢占式操作系统,就是说如果一个进程得到了 CPU 时间,除非它自己放弃使用 CPU ,否则将完全霸占 CPU 。因此可以看出,在抢占式操作系统中,操作系统假设所有的进程都是“人品很好”的,会主动退出 CPU 。在抢占式操作系统中,假设有若干进程,操作系统会根据他们的优先级、饥饿时间(已经多长时间没有使用过 CPU 了),给他们算出一 个总的优先级来。操作系统就会把 CPU 交给总优先级最高的这个进程。当进程执行完毕或者自己主动挂起后,操作系统就会重新计算一 次所有进程的总优先级,然后再挑一个优先级最高的把 CPU 控制权交给他。

    一个例子

    例子说明:在控制台中创建两个线程,在线程中分别输出0-100的数字,代码如下:

     1     class Program
     2     {
     3         static void Main(string[] args)
     4         {
     5             Thread thchild = new Thread(new ParameterizedThreadStart(Run));
     6             thchild.Start("thread  1 开始");
     7             Thread thchild2 = new Thread(new ParameterizedThreadStart(Run));
     8             thchild2.Start("thread 2 开始");
     9             Console.Read();
    10         }
    11         static void Run(object obj)
    12         {
    13 
    14             for (int i = 0; i < 100; i++)
    15             {
    16                 Console.WriteLine(obj.ToString() + "	" + i.ToString());
    17                 //Thread.Sleep(0);
    18             }
    19         }
    20     }

    测试结果

    加上Thead.Sleep(0)测试结果

    通过上面两张图的简单对比,有这样一种现象

    在没有Thread.Sleep(0)的时候,Thread1和Thread2交换的频率比较低,在使用了Thread.Sleep(0)的时候,Thread1和Thread2交换频率明显增高。

    总结

    关于Thread.Sleep(0)的详细内容可参考上面转载的那篇文章,觉得介绍的更详细,也比较有趣。当然给的例子,也是一种猜测性质的,系统中跑了那么多的线程,是不是对这个测试结果有干扰,也未可知。也不知道该怎么测试更合适。如果您也遇到过这种情况,不妨留言,讨论一下。

  • 相关阅读:
    【译】第九篇 Integration Services:控制流任务错误
    【译】第九篇 Replication:复制监视器
    【译】第八篇 Replication:合并复制-How it works
    【译】第七篇 Replication:合并复制-订阅
    【译】第六篇 Replication:合并复制-发布
    【译】第五篇 Replication:事务复制-How it works
    【译】第四篇 Replication:事务复制-订阅服务器
    SVG格式图片转成HTML中SVG的Path路径
    纯css隐藏移动端滚动条解决方案(ios上流畅滑动)---转载
    金额格式化,例子:fmoney("12345.675910", 3),返回12,345.676
  • 原文地址:https://www.cnblogs.com/wolf-sun/p/4175741.html
Copyright © 2020-2023  润新知