1.你在什么情况下使用多线程,怎么利用多线程带来的优势
2.你在使用多线程时都遇到什么问题,怎么解决
3.你一般怎么调试多线程程序
4.你怎样检测死锁与同步错误<静态的与动态的,即程序运行前与运行时>

解决方案 »

  1.   

    MSDN中有篇文章是讲如何检测死锁的
    Detecting Deadlocks in Multithreaded Win32 Applications
    (原谅小弟的初中生英文水平,哪位老兄能将它翻译出来?)
      

  2.   

    1.界面假死或者任务量大时
    2.内存错误,注意内存的释放还是引用一下别人的心得进程与线程
    进程和线程是两个相对的概念,通常来说,一个进程可以定义程序的一个实例(Instan
    ce)。在Win32中,进程并不执行什么,它只是占据应用程序所使用的地址空间。为了让
    进程完成一定的工作,进程必须至少占有一个线程,正是这个线程负责包含进程地址空
    间中的代码。实际上,一个进程可以包含几个线程,它们可以同时执行进程地址空间中
    的代码。为了做到这一点,每个线程有自己的一组CPU寄存器和堆栈。每个进程中至少有
    一个线程在执行其地址空间中的代码。如果没有线程执行进程地址空间中的代码,进程
    也就没有继续存在的理由,系统将自动清除进程及其地址空间。
    多线程的实现原理
    创建一个进程时,它的第一个线程称为主线程(Primary thread),由系统自动生成。
    然后可以由这个主线程生成额外的线程,而这些线程,又可以生成更多的线程。
    在运行一个多线程的程序时,从表面上看,这些线程似乎在同时运行。而实际情况并非
    如此,为了运行所有的这些线程,操作系统为每个独立线程安排一些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)。在这些对象中,临界区对象使用起来最简单,它的
    缺点是只能同步同一个进程中的线程。另外,还有一种基本的方法,本文称为线性化方
    法,即在编程过程中对一定数据的写操作都在一个线程中完成。这样,由于同一线程中
    的代码总是按顺序执行的,就不可能出现同时改写数据的情况。
      

  3.   

    http://www.microsoft.com/china/msdn/archives/technic/develop/vc/0214b.asp
      

  4.   

    3
    Detecting and Isolating Memory Leaks Using Microsoft Visual C++
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnvc60/html/memleaks.asp
      

  5.   

    1.你在什么情况下使用多线程,怎么利用多线程带来的优势
    (1)如果在你的计算上安装了多个CPU这样可以使用多线程
    (2)为了提高用户响应速度(也就是说你的程如果要同时操作多个事情,并且有长有短
    如果使用批处理这样就对用户短任务有延时)
    (3)操作中有I/O,程序要等特I/O操作完成
    (4)并行算法(要多CPU才有优势,或其中有些步骤有I/O等待,而在I/O等待时可以进行其它计算)
    (5)架构计算的需要,因为多线程可以很要的分工合作所以可以使架构容改变(当然具体情况具体分析)
    2.你在使用多线程时都遇到什么问题,怎么解决
    (1)多线程程序最主要的就是同步,互斥,死锁问题。
    (2)使用各种比较成熟的技术解决3.你一般怎么调试多线程程序
    (1)根据逻辑,设定断点,进行调试4.你怎样检测死锁与同步错误<静态的与动态的,即程序运行前与运行时>
    死锁-在写程序时尽量避免产生死锁的可能性
    运态使用算法来检测死锁(银行家算法等)
    对产生死锁的几大条件在写程序时注意,是最主要的(使用运态检测,删除并不是要方法)2.你在使用多线程时都遇到什么问题,怎么解决
    3.你一般怎么调试多线程程序
    4.你怎样检测死锁与同步错误<静态的与动态的,即程序运行前与运行时>
      

  6.   

    我认这为下面的情况是使用多线程的典型:
    1.多CPU<或者HT>,使用并行计算,提高性能
    2.长时间的操作,避免锁定UI线程
    3.异步IO
    4.后台处理
    5.Procducer/Consumer
    ...
      

  7.   

    调试时我一般对线钱程进行命名
    SetThreadName/GetThreadName,对锁也进行命名,这样死锁的时间就可以得到哪个线程拥有哪个锁。
      

  8.   

    1.通常在I/O处理的时候使用多线程,例如串口操作,读写文件,socket I/O等。
      或者在需要在后台处理的事务。
    2.同步问题是经常遇到的,关键还是在设计数据的时候要考虑到可能出现的同步问题,用同步对象来处理。
    3.多线程调试问题,关键还是要分清处理哪个线程,通常使用线程的id来区分。
    4.这个问题最麻烦,可能需要凭经验+运气。
      

  9.   

    yinzhaohui说的就是我所谓的WatchDog线程,但我一般在调试才用它,发行版 就没有了。
      

  10.   

    1.你在什么情况下使用多线程,怎么利用多线程带来的优势为防止计算量较大的程序运行时,界面停止响应,可以使用多线程。利用多线程平均分配CPU时间片的特性,可以实现多个任务同时进行。2.你在使用多线程时都遇到什么问题,怎么解决使用多线程可能遇到最普遍的问题,就是多线程运算、取值的时候,多个线程如果同时存取同一内存单元的内容,可能导致运行结果千差万别。解决的方法是使用多线程同步机制,建立临界区、设定互斥量,最终目的还是为了保持多个线程之间相互配合,相互等待,达到运行一致的效果。目前知道的就这么多,向高人学习……
      

  11.   

    1.你在什么情况下使用多线程,怎么利用多线程带来的优势
      需要同步执行时,主要是实时收发数据2.你在使用多线程时都遇到什么问题,怎么解决
      主要是同步问题3.你一般怎么调试多线程程序
      单步调试,其它...4.你怎样检测死锁与同步错误<静态的与动态的,即程序运行前与运行时>
      一般没有碰到,如果有问题,查查代码就知道了
      

  12.   

    多线程程序、网络程序调试很麻烦,尤其是改别人的复杂程序,我都使用最原始的调试方法,log!
    现在的log工具没几个好用的,都是自己写。
      

  13.   

    log是好工具,OutputDebugString+DebugView.
      

  14.   

    在socket通讯的服务端监听和文件传输的地方使用多线程
      

  15.   

    从线程A需要中止其他线程的时候,退出时资源清理很容易出问题。
    采取的办法是,尽量不用terminatethread,使用setevent, postmessage等方法
    通知要中止的线程自己exitthread.
      

  16.   

    对纯粹的cpu计算问题(单cpu)使用多线程反而会降低效率。
    一般都是io方面使用多线程,
    但是一个系统压力不大时使用多线程也是浪费,线程间切换也需要耗费计算能力的!
    总之避免简单的事情复杂化!
      

  17.   

    我采用多人(线程)写过很简单的一个spider,大家要注意CString 是线程不安全的,我调了好久才知道!!
      

  18.   

    to :SolarisX()
      CString 是线程不安全的?
    有什么证据么?
      

  19.   

    多数的MFC类都不是线程安全的。
      

  20.   

    学习
    请教高手,什么时候用临界区CCriticalSection,什么时候用CMutex,什么时候用CEvent呢?
      

  21.   

    win32 多线程程序设计 
    华中科技大学出版社
    jim beveridge & robert wiener著
    侯捷译
    这本书好像对这一方面讲得很好
    大家可以去看看呀.
      

  22.   

    1.你在什么情况下使用多线程,怎么利用多线程带来的优势
      不太好说,用例子吧,比如网络的通信,或是需要一些后台做工作的时候
     
    2.你在使用多线程时都遇到什么问题,怎么解决
       同步和死锁
       看书(win32多线程程序设计,windows核心编程),网上找资料
    3.你一般怎么调试多线程程序
       打印信息到屏幕(当然输出做同步的前提下),或是输出到文件(书上说
       这么做不好期待有人给出好办法)
    4.你怎样检测死锁与同步错误<静态的与动态的,即程序运行前与运行时>
       没有太多办法,只能靠经验和眼睛(程序没有反映了)
      

  23.   

    CPU处理单个任务绰绰有余,并且多个任务可以并行进行(提高CPU使用率);多个任务都需要及时得到响应。感觉就这些吧。
      

  24.   

    1.你在什么情况下使用多线程,怎么利用多线程带来的优势
    有件事情需要不停地做的时候就用多线程,例如不停地检测串口是否收到东西;2.你在使用多线程时都遇到什么问题,怎么解决
    线程间的同步互斥,一般我都用lock;3.你一般怎么调试多线程程序
    写满TRACE4.你怎样检测死锁与同步错误<静态的与动态的,即程序运行前与运行时>
    用TRACE
      

  25.   

    界面会假死,我等的不耐烦的时候会用多线程。
    能明显提高效率的时候我会用多线程,比如下载。
    每次调试的时候,我都想去找个人抽一顿。
    我觉得最好用的还是TRACE或者是WaitForSingleObject,或者是WaitForMultiObject。
    我准备改行去卖水果了。
    顺便说一句,我家楼下有个卖锅贴的,TMD,他竟然能在我家对面的小区买房子了。这个打击是无比巨大的。
      

  26.   

    3.你一般怎么调试多线程程序
    我觉得主要还是在设计的时候先把结构和逻辑理清楚,调试只能作为辅助手段
    我一般使用trace来进行调试
    4.你怎样检测死锁与同步错误<静态的与动态的,即程序运行前与运行时>
    对于检测我没什么经验,不过我觉得应该做到:
    把各个线程所要完成的功能划分清楚,
    线程之间的耦合关系应该清晰明了并达到最小化
      

  27.   

    能不能介绍点多线程与ado数据库的运用
      

  28.   

    1.什么时候都可以,只要你认为有大量得数据需要处理,那么你就要开线程。主要用于网络程序。但不要过多,如果你得CPU只有一个,那么你不要开超过3个得线程
    2.释放资源,防止线程死锁
    3.线程中设置断点,然后使用如下语句TRACE("Thread Id is ",dwThreadId);dwThreadId是创建线程时得ID
    4.仔细观察你得程序,如果一段代码中有两个WaitForSingleObject,那么及有可能死锁!!
      动态时那就只能靠经验了
      

  29.   

    4.你怎样检测死锁与同步错误<静态的与动态的,即程序运行前与运行时>
    我用watch dog thread
      

  30.   

    通常我一个运输机带2个坦克骚扰对方矿区,同时正面推进,家里造兵的时候会用多线程操作。
    这个东西没250+的apm,是比较困难的!
      

  31.   

    idAnts
    都2005了
    还玩starcraft...
      

  32.   

    用多线程还是处理界面假死,
    DIRECTSHOW的实现是图象显示一个线程
    数据传送至少一个线程http://www.flounder.com/workerthreads.htm 
    http://www.flounder.com/uithreads.htm