有关于MFC和多线程,有段话不理解
《win32多线程编程》这本书在讲到MFC中多线程编程的时候有一段话我不理解:
MFC多线程程序有一个重大限制,会影响你所做的几乎每一件事情。MFC各对象和Win32 Handles之间的映射关系记录在线程局部存储之中,因此你没有办法把一个MFC对象从某个线程手上交到另一线程手上,你也不能够在线程之间传递MFC对象指针。。。。这个限制的存在阻止了“为这些对象产生同步机制”的必要性,那会大大影响MFC的速度效率。
我的直觉理解是就像在Win32程序中,句柄是存在于进程空间中的,所以不能在进程中传递句柄。(当然用继承,或者命名,或者复制句柄是另外一回事)就是不能像函数传递参数一样传递句柄对吗?
[解决办法]
进程间肯定不能传递句柄,线程间可以,你引用的那段话是说不能在线程间传递MFC对象(而不是句柄),MFC对象不是线程安全的,对象和句柄的对应关系存储在创建这个对象的线程TLS里,即使你把MFC对象传递过去了,在另一个线程的TLS里是找不到这种对应关系的,这时就会引发一发ASSERT断言(查找失败,函数名忘了)。与此类似的跨线程传递一个句柄,想通过CWnd::FromHandle来得到一个MFC对象的指针也是错误的,因为在这个线程里根据句柄去查找与之关联的MFC对象是不存在的,FromHandle这个函数会构造一个临时对象,这个对象你只能访问句柄,不能访问其他任何数据成员,所以这种操作是没必要的