| 多线程编程应该注意的问题 从线程应用程序比单线程应用程序处理起来要更小心,因为是多个,每个线程都有自己的执行路线,不好控制,容易出问题。下面我们就看看在使用MFC进行多线程编程中应该注意的问题。 出于所占空间和效率的问题,MFC对象只在对象一级是安全的。你可以让两个线程处理两个数组,但不能让两个线程处理同一个数组,这可能就要出问题了。如果你必须使多个线程共同处理一个对象,必须使用适当的Win32同步机制。这方面的内容请参阅其它资料。类库使用临界区内部保护全局数据结束,如那些调试时使用的内存。如果你的应用程序中使用的线程不是使用CWinThread得到的,那就不能那个线程访问其它的MFC对象。 作为一个通用规则,线程只能访问它创建的MFC对象,这是因为临时的和永久的Windows句柄映射保存于线程本地存储中,这些句柄可以在多个线程访问数据时进行同步机制的保护。例如,工作线程不能执行一个计算,它调用文档的UpdateAllViews成员函数来更新所有的视,可是这并不能起作用,因为从CWnd对象到HWND的映射对主线程是局部的。这也就是说,一个线程可以拥有一个从Windows句柄到C++对象的映射,但不同的线程可以将同一个句柄映射到不同的C++对象,在一个线程中的改变不会影响到其它线程。 解决这个问题有几个办法,一个是传送进一个单独的句柄,而不是一个C++对象进工作线程。工作线程通过调用适当的FromHandle函数将这些对象加载到它的临时映射中去。当然也可以通过调用Attach加对象加到永久映射中去,但是这时你必须能够保证这个对象的生存时间比线程要长。 另一个办法是创建新的用户自定义消息,不同的线程使用不同的消息通知主程序什么事情发生了。 |