多线程编程中应该注意的问题.doc_第1页
多线程编程中应该注意的问题.doc_第2页
多线程编程中应该注意的问题.doc_第3页
多线程编程中应该注意的问题.doc_第4页
多线程编程中应该注意的问题.doc_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

多线程编程中应该注意的问题1. 线程的优先级多线程编程中要注意协调好各个线程的优先级。一般来说,控制线程的优先级要高于Worker线程。这样做,可以保证Client(最终用户或者其他模块)尽快得到响应。当控制线程是与最终用户交互的界面线程时更应如此,如果界面线程优先级较低,界面可能较长时间没有反应,用户很可能会怀疑命令是不是还没有开始执行。下面两张图给出了控制线程优先级不同对Client造成不同响应时间的对比。Fig 1.1 控制线程优先级低,对用户响应时间较长Fig 1.2 控制线程优先级高,对用户响应时间较短2. 防止栈溢出这个问题不只存在在多线程编程中。防止栈溢出可以参考下面几条建议:1) 不在函数体内定义特别大的栈变量,必须要定义的时候,可以使用new在堆上分配。2) 传递参数时,大的参数(如结构体,类)使用按指针传递,小的参数(如基本数据类型)使用按值传递。Fig 2.1 大对象作为参数时,按值传递的过程Fig 2.2 大对象作为参数时,按指针传递的过程。由Fig 2.1和Fig 2.2可以看出,对于较大的对象,按指针的传递的资源消耗较小,空间上,仅需把一个指针压栈;时间上,省去了拷贝构造函数的调用。所以在传递大的对象时,应该使用按指针传递。Fig 2.3 参数为基本类型时,按值传递的过程Fig 2.4 参数为基本类型时,按指针传递的过程。对比Fig 2.3和Fig 2.4可以看出,对于基本数据类型,按指针传递的方法反而会消耗较多的时间,而且当参数所占的字节数小于一个指针所占的字节数(4个字节)时,按指针传递也会消耗较多的空间。所以当参数为基本数据类型时,应该使用按值传递。3. Run函数中Event的处理顺序在Run函数同时Wait到两个或者以上Event时,要特别注意处理这些Event的先后顺序,避免因处理顺序不当引起的问题。如果Wait函数每次只能接收一个事件,则上述问题不需要特别关注。4. 提高控制线程的响应速度1) 减轻控制线程的负担,把更多的工作交给Worker线程来做。这么做的原因和第一条一样,是为了提高控制线程的响应速度,从而提高Client的满意度。2) 注意Worker线程中信号量的使用,防止Worker线程长时间堵塞控制线程。典型的,控制线程和Worker线程会同时访问一个成员变量,并且其中至少有一个线程还要修改这个成员变量,如果Worker线程用信号量Lock了这个成员变量,然后做一些费时的工作(比如操作数据库),那么在它完成这些工作并Unlock这个成员变量之前,控制线程访问这个成员变量时都会被堵塞。所以,应该尽量减少Worker线程Lock的时间。下图中演示了堵塞发生的过程,红色的部分表示控制线程被堵塞了。Fig 4.1 Worker线程堵塞控制线程的发生过程Fig 4.2 防止Woker线程堵塞控制线程的方法。上图给出的解决方法实际上是尽量减少Worker线程的Lock时间,把DB读出的数据暂时先放在临时变量中,仅当需要更新m_pData时才开始Lock。5. 做一个强有力的控制线程,减少Worker线程被唤醒的次数对来自Client的事件,控制线程应该加一些基本的过滤,对于可以简单地判断出不需要Worker线程处理的事件,如一些在当前状态下不能处理,不需要处理,或者处理起来不费多少时间的事件,应该直接处理掉或者丢弃掉,而不是全部都发送给Worker线程。例如,Map中处理描画事件的方式就值得学习,当追加描画和擦除后再描画,两个事件同时到来时,Map的处理方式是仅处理擦除后再描画,追加描画直接忽略了。6. 注意信号量的使用在一个线程运行过程中,应该避免出现以下的使用方法:FuncLock();Unlock();Lock();Unlock();这是因为,如果第一次Unlock和第二次Lock之间,成员变量的值可能发生了变化,而如果Func函数恰好在两次Lock的时候都用到了那个发生了变化的成员变量,那么错误就有可能发生了。Fig 6.1 多次Lock时出现的问题。可以看

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论