荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: jjksam (ramdisk_size=32768), 信区: Program
标  题: Re: 浅谈Windows中的多线程编程[转载]
发信站: 荔园晨风BBS站 (Sun Apr 11 14:36:31 2004), 站内信件


【 在 qyf (奋起) 的大作中提到: 】
:   子进程完成之后,是否都会主动向父进程发送一个完成信号,再由父进程
:清除这个僵死进程?

一般清除僵死进程是由内核做的。

创建子进程后,父进程有三个选择:
一、让子进程自生自灭。只是如果子进程死了,则由内核告诉父进程这个事情。
    并不是由子进程告诉父进程。
二、停下来,等待子进程去世。
三、结束自己的生命。

本质来说可以分为同步(blocking)和异步(nonblocking)两种


ps: 这个题目是说多线程,不是说多进程,概念不大相同的。 不能混淆。

【 在 jjksam (ramdisk_size=32768) 的大作中提到: 】
: 我想直接用代码来说明问题更好, 直观点,不过这些基础知识当然是要知道的.
: 【 在 hellsolaris (qq) 的大作中提到: 】
: : 【 以下文字转载自 Linux 讨论区 】
: : 【 原文由 zllz.bbs@bbs.cqupt.edu.cn 所发表 】
: : 多线程的实现原理
: : 创建一个进程时,它的第一个线程称为主线程(Primary thread),由系统自动生成。
:                             linux下是叫守护进程deamon吧?

                             daemon的作用就是产生子进程后,自己一定会消亡。
                             但是这里说的并不是这种情况,文中说的包括的范围
                             要更广一点。而且这里只是说windows中的概念。
                             有时Linux/UNIX和windows的概念并不能相等价的。

: : 然后可以由这个主线程生成额外的线程,而这些线程,又可以生成更多的线程。
: : 在运行一个多线程的程序时,从表面上看,这些线程似乎在同时运行。而实际情况并非
: : 如此,为了运行所有的这些线程,操作系统为每个独立线程安排一些CPU时间。单CPU操
: : 作系统以轮转方式向线程提供时间片(Quantum),每个线程在使用完时间片后交出控

: : ,系统再将CPU时间片分配给下一个线程。由于每个时间片足够的短,这样就给人一种

: : 象,好像这些线程在同时运行。创建额外线程的唯一目的就是尽可能地利用CPU时间。
: : 多线程的问题
: : 使用多线程编程可以给程序员带来很大的灵活性,同时也使原来需要复杂技巧才能解决
: : 的问题变得容易起来。但是,不应该人为地将编写的程序分成一些碎片,让这些碎片按
: : 各自的线程执行,这不是开发应用程序的正确方法。
: : 线程很有用,但当使用线程时,可能会在解决老问题的同时产生新问题。例如要开发一
: : 个字处理程序,并想让打印功能作为单独的线程自己执行。这听起来是很好的主意,因
: : 为在打印时,用户可立即返回,开始编辑文档。但这样一来,在该文档被打印时文档中
: : 的数据就有可能被修改,打印的结果就不再是所期望的内容。也许最好不要把打印功能
: : 放在单独的线程中,不过如果一定要用多线程的话,也可以考虑用下面的方法解决:第
: : 一种方法是锁定正在打印的文档,让用户编辑其他的文档,这样在结束打印之前,该文
: : 档不会作任何修改;另一个方法可能更有效一些,即可以把该文档拷贝到一个临时文件
: : 中,打印这个临时文件的内容,同时允许用户对原来的文档进行修改。当包含文档的临
: : 时文件打印完成时,再删去这个临时文件。
: : 通过上面的分析可以看出,多线程在帮助解决问题的同时也可能带来新问题。因此有必
: : 要弄清楚,什么时候需要创建多线程,什么时候不需要多线程。总的来说,多线程往往
: : 用于在前台操作的同时还需要进行后台的计算或逻辑判断的情况,而对于GUI(图形用

: : 接口),除了开发MDI(多文档界面)应用程序外,应尽量不使用多线程。
: : 线程的分类
: : 在MFC中,线程被分为两类,即工作线程和用户界面线程。如果一个线程只完成后台计

: : ,不需要和用户交互,那么可以使用工作线程;如果需要创建一个处理用户界面的线程
: : ,则应使用用户界面线程。这两者的主要区别在于,MFC框架会给用户界面线程增加一

: : 消息循环,这样用户界面线程就可以处理自己消息队列中的消息。这样看来,如果需要
: : 在后台作一些简单的计算(如对电子表格的重算),则首先应考虑使用工作线程,而当
: : 后台线程需要处理比较复杂的任务,确切地说,当后台线程的执行过程会随着实际情况
: : 的不同而改变时,就应该使用用户界面线程,以便能对不同的消息作出响应。
: : 线程的优先级
: : 当系统需要同时执行多个进程或多个线程时,有时会需要指定线程的优先级。线程的优
: : 先级一般是指这个线程的基优先级,即线程相对于本进程的相对优先级和包含此线程的
: : 进程的优先级的结合。操作系统以优先级为基础安排所有的活动线程,系统的每一个线
: : 程都被分配了一个优先级,优先级的范围从0到31。运行时,系统简单地给第一个优先

: : 为31的线程分配CPU时间,在该线程的时间片结束后,系统给下一个优先级为31的线程

: : 配CPU时间。当没有优先级为31的线程时,系统将开始给优先级为30的线程分配CPU时间
: : ,以此类推。除了程序员在程序中改变线程的优先级外,有时程序在执行过程中系统也
: : 会自动地动态改变线程的优先级,这是为了保证系统对终端用户的高度响应性。比如用
: : 户按了键盘上的某个键时,系统就会临时将处理WM_KEYDOWN消息的线程的优先级提高2

: : 3。CPU按一个完整的时间片执行线程,当时间片执行完毕后,系统将该线程的优先级减
: : 1。
: : 线程的同步
: : 在使用多线程编程时,还有一个非常重要的问题就是线程同步。所谓线程同步是指线程
: : 之间在相互通信时避免破坏各自数据的能力。同步问题是由前面说到的Win32系统的CPU
: : 时间片分配方式引起的。虽然在某一时刻,只有一个线程占用CPU(单CPU时)时间,但
: : 是没有办法知道在什么时候,在什么地方线程被打断,这样如何保证线程之间不破坏彼
: : 此的数据就显得格外重要。在MFC中,可以使用4个同步对象来保证多线程同时运行。它
: : 们分别是临界区对象(CCriticalSection)、互斥量对象(CMutex)、信号量对象(CS
: : emaphore)和事件对象(CEvent)。在这些对象中,临界区对象使用起来最简单,它的
: : 缺点是只能同步同一个进程中的线程。另外,还有一种基本的方法,本文称为线性化方
: : 法,即在编程过程中对一定数据的写操作都在一个线程中完成。这样,由于同一线程中
: : 的代码总是按顺序执行的,就不可能出现同时改写数据的情况。


--



--
     。.
      ."。
      █D

 Would you like to have a cup of cola with me?

※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.0.234]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店