- 多线程编程必须有操作系统为基础,知道什么是互斥、临界区、事件、信号量等概念;
- 知道线程是CPU资源分配的基本单位;
给线程分配CPU,可以用:SetThreadAffinityMask(tHandle,0x00000001)函数,tHandle表示线程的HANDLE(不是CWinThread*),第二个参数表示可以使用的CPU的编号,0x00000001表示只能使用第一个CPU;如果0x00000011,表示可以使用第一和第二个CPU,依此类推; - WaitForSingalObject()的参数是HANDLE而不是对象,如果是CEvent的对象要写成WaitForSingalObject(CEvent.m_hObject, INFINITE),不能乱了。用完事件之后,调用Reset来重置状态;
- CMutex.lock()已经包含了WaitForSingalObject()的功能,不要重复用。CEvent没有Lock函数,要按3中所说的做;
- Wait的两个函数等待的过程中并不消耗CPU;
- 在访问互斥资源时一定把互斥资源用CMutex.Lock()和CMutex.Unlock()包起来;
- 等待所有线程结束可以用WaiForMultipleObjects()函数,用法跟WaitForSingleObject很相似,但是注意一个参数;
- 写程序之前一写把各个线程之间的关系、哪些资源是互斥的、哪些代码段应该做成临界区这些弄清楚。如果是同一个函数的各个线程用临界区比用互斥的效率要高很多;
- 多线程的调试很麻烦,可以用写文件的方法来看线程中各个变量的情况,但是要注意,文件也是互斥资源,不能同时在两个线程里读写;也可以通过单步调试,调试的时候可以只把要调试的线程加上断点,方便一些,否刚程序在各个线程之间跳来跳去,眼花缭乱;
- STL中的queue类,没有元素的时候调用.front()或者.end()会出错:“dque iterator not dereferencable”。在调用这两个函数之前要确保.size()不为0;
- 还没想到。
MFC多核多线程编程遇到的问题总结
by
Comments
5 responses to “MFC多核多线程编程遇到的问题总结”
-
总结的非常好。
我为WaitForSingalObject(CEvent.m_hObject, INFINITE)郁闷了几天,被你一下子说清楚了。 -
CEvent是有Lock函数的,CEvent的父类是CSyncObject,这个类有个成员函数Lock,看一下声明:virtual BOOL Lock(DWORD dwTimeout = INFINITE );也就是说这个函数是个虚函数,在CEvent里没被重写,那么将会调用父类的Lock函数。
-
收藏了,感谢博主!
-
好久 没用 mfc 了 改用qt了
-
项目用的mfc,没有办法,也想摆脱m$
-
Leave a Reply