zoukankan      html  css  js  c++  java
  • Sleep(0)及其使用场景

    Sleep(n)的作用是让当前线程睡眠n毫秒,以便执行其他线程,如果没有其他线程,那睡眠n毫秒后,继续执行。

        而如果n=0,Sleep(0)是指CPU交出当前线程的执行权,让CPU去执行其他线程。也就是放弃当前线程的时间片,转而执行其他线程。

        那么,Sleep(0)应该在那种情况下使用? 一般来说,如果当前线程比较耗时比较占CPU资源,可以在结尾处加上Sleep(0), 这样效率会得到大大的提高。

        另外,还可以用这种方法来保证线程同步,线城池工作时,主线程使用Sleep(0)来等待线程池里所有的线程都完成运行。当线程池线程非常多的时候,这种方法确实是一种非常有效的节省cpu的方式,因为它节省了在线程里使用内核来进行同步的开销。

    1. void SetCopyFile(short progress)
    2. {
    3.     if (progress != 100 && m_t1)
    4.          m_t1 = FALSE;
    5.     if (m_CopyPro + m_span <= progress || 100 == progress)
    6.      {
    7.         if (100 == progress && m_t1)
    8.             return ;
    9.          ::PostMessage(m_pcHiddenWnd->m_hWnd , WM_CCOPYPROGRESS, progress, 0);
    10.          m_CopyPro = progress;
    11.          Sleep(0);
    12.      }
    13. }

        如上代码,由于该代码处于一个多线程运行的环境中,而拷贝progress又是不停的进行,不断地调用PostMessage()函数,同时还要做消息映射,执行消息相应函数等等,因此这是一个比较耗时的过程,此时,sleep(0)就派上用场了, 加在后面,让其他线程也能及时得到运行。




        以前在同一个进程里,特别钟爱用Sleep(0)来做一些情况下的线程同步。譬如当线城池工作时,主线程使用Sleep(0)来等待线程池里所有的线程都 完成运行。当线程池线程非常多的时候,这种方法确实是一种非常有效的节省cpu的方式,因为它节省了在线程里使用内核来进行同步的开销。而且很重要的,它 运作的很好,可以说完全在我的控制之内。

        然而在我换上了双核cpu后,问题出来了:Sleep(0)经常会比预期中更早返回。当初的设计代码根本没有考虑过多核/多cpu方式下的线程调度。

        看来,速度和方便,还是难以两全其美。如果数据对同步敏感,还是不能偷工减料。

        另外,在测试中发现非常奇怪的一点: 当线程池工作的时候,在任务管理器里设定该进程只能在一个cpu上运行的时候,该进城所占用的内存量急剧持续增长。而再设回允许在双核下调度时,内存量又开始缓慢持续减少

    http://hi.baidu.com/gclsoft/blog/item/a33fdafc66237c1c08244d51.html

  • 相关阅读:
    学渣的c#复习手记 类 二 字段与属性
    学渣的c#复习手记 类 一
    一个没有验证的学生文件存储代码(试验报告性质)
    初学C语言之指针:值类型和数组
    增删改查
    python socket的send不能发送字符串解决办法
    正则
    字符串运算符r
    类的私有属性
    运算符重载__add__
  • 原文地址:https://www.cnblogs.com/vc60er/p/3998645.html
Copyright © 2011-2022 走看看