PctGL SERIES  
http://pctgl.cnblogs.com

Windows 多线程编程属于高级编程范围,因为涉及调用的 APis 众多,所以称之谓高级编程一点不为过。

编写 Windows 多线程程序并不是一件多么复杂的事情,但目前还没有哪个编译器或调试环境能够完美的

协助 Coders 方便的调试多线程代码,所以编写此类应用则稍显麻烦。

一、什么是多线程

    多线程很好理解,从宏观上举例说,世界上的每个国家都可看做一个进程,每个国家的每个人都可以

看做一个线程,每个线程都可以独立完成任何在他权限以内的任何事情。如果说你是领导,当然你可以做

的事情更多,多线程也是如此,如果操作权限级别够高,能执行的“特别”代码更多。


二、多线程有什么特点

    多线程最大的特点就是充分的利用了 CPU 资源,所谓人多力量大即使如此。

    基于 80X86 的 INTER/AMD CPU 早期时,每个 CPU 只有一个处理单元。近期出现的 CPU 更为复

杂一些,达到了两个甚至更多个处理单元共用一个缓存器。

    在多个处理单元的计算机系统中,多线程可以实现并行运算,每个线程可以一直做他未完成的事情直到

结束。但这显然是不符合现实的,现实中我们要综合考虑一切外因,比如生产成本,效率,时间等问题,多

个处理单元意味着更多的 ¥,这样的话会严重制约计算机的发展。计算机最终的目的是替代人类部分脑力

劳动,如果刚刚发展就受到 ¥的制约,显然是不行的。

    人类是伟大的,用单个 CPU 执行单元模拟多线程并行计算出现了。 Windows 操作系统,将 CPU 每

个时钟周期分成时间片,每个线程均在这一周期内的时间片上"存活"一段时间.这样简单的多线程模拟出现了

由于 CPU 不断在各个线程内切换,且切换速度非常快,每个程序的执行都实现了“连续”运行。
 

三、Windows 系统环境下多线程的特点

    单 CPU 多线程的系统环境下,多线程发挥了 CPU 的最大潜力,每个程序均连续运行,用户体验到的

是一个近似完美的计算机应用效果。

    为什么我们的计算机系统要每隔一段时间就需要重新安装?大多数都可以解释为由于不熟悉 Windows

操作系统的设置导致 CPU 在一个时钟周期内执行的线程过多,导致系统需要将时间片划分的更小以完成更

多的任务,这样每个程序实际在一个时钟周期内只能运行几毫秒。


四、 Windows 系统环境下的抢占式多线程操作

    上面已经说过,系统将 CPU 时间分配在系统内,存在的每个线程上,每个线程均执行 N 毫秒。如果我

们的程序是单线程,也就是说每个CPU时钟周期,我们的程序只运行过一次。如果是多线程呢?

    不要高兴的太早,我们的程序不会被 Windows 成倍的照顾到的。多线程是个复杂的过程,用简单的话

可以让你明白他的执行原理,但他决不仅限于这些。


五、Windows 系统环境下多线程的其他组成部分

    1. 优先级    优先级决定了系统是不是要将更多的 CPU 时间用于某个优先级更高的线程。

    2. 运行概率  是否有一点不可思议?这就是为什么增加成倍的线程而不能成倍增加执行效率原因之一。

    3. 暂停      很明显,暂停一个线程的运行,让他处于休眠状态。

    4. 退出      退出一个线程或者叫中止一个线程的执行。

    5. 多线程能够提高一个应用程序的效率有多大?
                如果这是一个一般的应用程序,如数据库操作类那么多线程可以提高最大约 15%的效率。
                如果是一个网络操作类程序,那么执行效率能够提高至少 15% 上。

    6.是否应该将某个应用程序的线程优先级调整到最高?
                这不是一个能够发布的软件或者说 Coders 要想的事。如果你是一个病毒制作者那么你
                完全可以认为这句话不是给你看的。


六、VisualBasic6.0 中 Windows 系统多线程编程

    在开始实例演示前,需要提前明白一些有关多线程编程的基本 APis。
   
    1. CreateThread  ·····················  创建线程
    2. TerminateThread  ··············  中止线程
    3. SetThreadPriority  ···············  设置线程优先级
    4. GetThreadPriority  ···············  获取线程的优先级
    5. SuspendThread  ················  挂起线程
    6. ResumeThread  ·················  从挂起状态恢复执行
    7. CloseHandle  ·····················  关闭一个已获取的线程句柄
    8. ExitThread  ·························  退出线程
posted on 2009-08-06 14:32  PctGL  阅读(474)  评论(0编辑  收藏  举报