多线程使用总结
基础:
1)最好使用C++ runtime的函数创建线程,即调用_beginthreadex创建线程。CreateThread()函数并不会执行C运行时数据块的变量的每线程初始化,因此在任何使用C运行时库的应用中,不能使用CrateThread()函数。
2)最好不要显示的调用ExitThread()或TerminateThread(),因为调用这些不进行清理工作。
3)SuspendThread()挂起线程时,要考虑该线程是否拥有Mutex或Semaphore,如果拥有的话可能会导致死锁。
4)信号量Semaphore,是一个可以限制对指定的临界段进行访问的线程的数目的数据结构。
5)互斥量Mutex和关键代码段CriticalSection,他们的作用是相同的,都是用来保证某时刻只有一个线程能够访问全局或静态的资源。区别是:Mutex是内核对象,可以设置等待超时时间,可以在不同的进程的线程中使用,但是所消耗的时间也比较多。CriticalSection与Mutex相反。
6)互锁函数,可以用来实现原子操作。对于一些简单的问题,比如说int变量的自加,交换。。。
7)线程局部存储(TLS),可以为全局或静态变量对不同的线程有不同的拷贝。
高级:
8)线程池,可以实现在程序中根据需要动态的创建线程,比如在server端,根据访问的用户的多少来创建线程的多少。在windows2000以后增加了创建线程池的API,比如 QueueUserWorkItem()。
9)线程的优先级,用来保证重要的事情先被完成。不能使用线程的优先级来解决线程的同步问题。
10) 处理器亲和,就是将线程固定在某cpu上执行,这样在某些情况下有助于提高性能,例如我们有双核的且支持超线程技术的cpu,我们有4个线程,有2个是IO操作,有2个是大量的计算,对于上面的问题,我们就可以使用处理器亲和,使用API设置,来达到cpu使用的均和,更好的提高性能。
11) 纤程,用户级的线程机制,比线程小的单位,开发人员负责管理纤程的调度,同时负责确定纤程何时在线程时间片上下文中运行,一般不会带来性能的提高,主要的目的是为开发人员调度多个不需要并行执行的任务提供一个便捷的机制。
12) 是否需要使用多线程,最总是需要测试来决定的,而且对于不同的CPU结果也不相同。避免使用过多的线程而带来性能下降。
其他多线程技术:
13) MFC多线程,多Windows多线程API的封装。
14) Boost多线程。
15) POSIX,Pthreads,是一个可以移植的多线程库。一般是Linux和Unix是商用较多。
16) Intel Open MP+,是一种可移植的多线程解决方案。(www.openmp.org)。
多线程调试:
17) 支持多线程的Log。
18) VS2005中,可以查看Thread窗口,挂起或恢复线程,切换当前的线程和检查线程状态。或是使用TracePoint来输出消息到output。
19)使用SetThreadName()来对线程命名,使用线程信息block (http://www.codeproject.com/threads/xtib.asp)。
20) 使用Intel多线程线程检测器,Intel调试器。。。