写在前面

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

Thread.Sleep(0)妙解

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

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

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

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

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

一个例子

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

     class Program
{
static void Main(string[] args)
{
Thread thchild = new Thread(new ParameterizedThreadStart(Run));
thchild.Start("thread 1 开始");
Thread thchild2 = new Thread(new ParameterizedThreadStart(Run));
thchild2.Start("thread 2 开始");
Console.Read();
}
static void Run(object obj)
{ for (int i = ; i < ; i++)
{
Console.WriteLine(obj.ToString() + "\t" + i.ToString());
//Thread.Sleep(0);
}
}
}

测试结果

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

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

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

总结

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

说说Thread.Sleep(0)的那些奇怪的事的更多相关文章

  1. 没有二十年功力,写不出Thread.sleep(0)这一行“看似无用”的代码!

    你好呀,我是喜提七天居家隔离的歪歪. 这篇文章要从一个奇怪的注释说起,就是下面这张图: 我们可以不用管具体的代码逻辑,只是单单看这个 for 循环. 在循环里面,专门有个变量 j,来记录当前循环次数. ...

  2. Thread.Sleep(0) vs Sleep(1) vs Yeild

    本文将要提到的线程及其相关内容,均是指 Windows 操作系统中的线程,不涉及其它操作系统. 文章索引 核心概念 Thread.Yeild       Thread.Sleep(0) Thread. ...

  3. 【转】Thread.sleep(0)的意义

    Thread.sleep(0)的意义 2012-03-23 17:47 2188人阅读 评论(2) 收藏 举报 windows算法unixthread 我们可能经常会用到 Thread.Sleep 函 ...

  4. Thread系列之Thread.Sleep(0)

    线程这一概念,可以理解成进程中的一个小单元.这个单元是一个独立的执行单元,但是与进程中的其他线程共享进程中的内存单元. 由于Cpu资源是有限的,所以进程中的多个线程要抢占Cpu,这也导致进程中的多个线 ...

  5. Thread.sleep(0)的意义& 多线程

    我们可能经常会用到 Thread.Sleep 函数来使线程挂起一段时间.那么你有没有正确的理解这个函数的用法呢?思考下面这两个问题: 假设现在是 2008-4-7 12:00:00.000,如果我调用 ...

  6. 关于Thread.Sleep(0)

    看到的文章,写的不错. 我们可能经常会用到 Thread.Sleep 函数来使线程挂起一段时间.那么你有没有正确的理解这个函数的用法呢?思考下面这两个问题:假设现在是 2008-4-7 12:00:0 ...

  7. 对线程调度中Thread.sleep(0)的深入理解

    在Java或者C#中,都会用到 Thread.Sleep()来使线程挂起一段时间.那么你有没有正确的理解这个方法的用法呢?思考下面这两个问题: 1.假设现在是 2014-8-13 17:00:00.0 ...

  8. Thread系列——Thread.Sleep(0)

    转载自:http://www.cnblogs.com/ATually/archive/2010/10/21/1857261.html 线程这一概念,可以理解成进程中的一个小单元.这个单元是一个独立的执 ...

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

    原文地址:http://blog.csdn.net/lgstudyvc/article/details/9337063 来自本论坛: 我们可能经常会用到 Thread.Sleep 函数来使线程挂起一段 ...

随机推荐

  1. devexpress 控制面板汉化方式 参考信息

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  2. 共享内存shared pool (6):追踪sql语句

    构建实验数据 --使用NC50用户查询(会话1) SQL> conn NC50/NC50 Connected. SQL> create table emp as select * from ...

  3. mini2440裸机之MMU(二)(mmu.c) (转)

    分类: 嵌入式 http://blog.chinaunix.net/uid-26435987-id-3082166.html(转) /********************************* ...

  4. SSD1306驱动的OLED实验

    [转]http://bbs.21ic.com/icview-434543-1-1.html 前面几章的实例,均没涉及到液晶显示,这一章,我们将向大家介绍OLED的使用.在本章中,我们将使用战舰STM3 ...

  5. iOS开发常用的宏

    #define SCREEN_WIDTH ([UIScreen mainScreen].bounds.size.width)#define SCREEN_HEIGHT ([UIScreen mainS ...

  6. 《大话设计模式》ruby版代码:策略模式

    需求: 商场收银软件,根据客户购买物品的单价和数量,计算费用,会有促销活动,打八折,满三百减一百之类的. 一,使用工厂模式. # -*- encoding: utf-8 -*- #现金收费抽象类 cl ...

  7. .Net码农学Android---五分钟了解布局

    在android中应用的界面是以xml来组织的,这一点和WPF相似,通过配置xml文件我们可以灵活的构建出你自己想要的界面. 而在所有的xml界面文件中,根节点必须是布局,即先有布局,然后在布局中组织 ...

  8. Linux查看文件以及文件夹的大小

    df可以查看一级文件夹大小.使用比例.档案系统及其挂入点,但对文件却无能为力.du可以查看文件及文件夹的大小. df命令可以显示目前所有文件系统的可用空间及使用情形,请看下列这个例子: df命令可以查 ...

  9. Android之通过向WebService服务器发送XML数据获取相关服务

    原理图如下:        即客户端向WebService服务器通过HTTP协议发送XML数据(内部包含调用的一些方法和相关参数数据),然后WebService服务器给客户端返回一定的XML格式的数据 ...

  10. AngularJs学习笔记-AngularJS权威教程学习笔记

    AngularJS是什么? AngularJS是一种构建动态Web应用的结构化框架.主要用于构建单页面Web应用, 增加抽象级别,使构建交互式的现代Web应用变得更加简单. AngularJS使开发W ...