线程安全就是线程间不会发生对相同数据区的访问冲突。
编写线程安全类的最简单的方法是用同步对象,Windows系统有几个用来处理线程同步和互斥的内核对象,象Semaphore,Mutex,Event一类的。
关于CSocket我不熟

解决方案 »

  1.   

    我在同一个线程中建立几个CSocket对象,那么哪些数据是“共同的数据区”呢?
    熟悉CSocket的高手也来看看呀!小弟在此谢过了!!!
      

  2.   

    to maxsuy(魔法兔子):
    能说得详细一点嘛?
      

  3.   

    MFC会按线程维护一个handle map,保存下列几种句柄(及相关的C++对象):HWND、HDC、HMENU、HPEN、HBRUSH、HFONT、HBITMAP、HPALATTE、HRGN、HIMAGELIST以及SOCKET(其实,CSocket不“安全”的主要原因不在SOCKET本身,而是因为CSocket使用了HWND)。注意,这些句柄在真正的Windows眼中均是线程无关的,其中很多不但能跨线程使用,甚至可以跨进程使用。但是MFC为了包装,必须提供C++类来对他们封装,为了对这些C++类管理,MFC引进了handle map的概念(这与PCB中的Kernel Handle Table完全是两码事)。但是handle map却是每个线程互不相干,因此线程间使用这些MFC类的话,会造成handle map的混乱,轻则程序出错,重则程序崩溃。
    至于为什么要使用handle map,原因也很简单:因为Windows句柄显然是唯一的,但MFC用C++类来包装Windows句柄时,如果不加任何保护措施,很可能造成两个C++对象同时与一个Windows句柄关联。设想一下,两个CWnd同时关联到一个HWND上,而两个CWnd对象各自有各自的消息映射,那么这个窗口的行为将是难以预料的。因此,用handle map来作保护,当你调用诸如Attach之类的函数时,MFC会查找handle map,如果已有对象与之关联,Attach就失败。同理,MFC还用handle map来维护GetParent、FromHandle这类函数返回的临时对象。
      

  4.   

    azuo_lee():
    高!阁下能不能进一步阐述一下如何解决跨线程CSocket对象的使用?
    小弟多谢啦!
      

  5.   

    hlh771(心宿):你也多说几句呀!