请教高手:何谓线程安全?怎么理解CSocket不是线程安全的?谢谢!!
高手请指点一二!
我是来听课的
线程安全就是线程间不会发生对相同数据区的访问冲突。 编写线程安全类的最简单的方法是用同步对象,Windows系统有几个用来处理线程同步和互斥的内核对象,象Semaphore,Mutex,Event一类的。 关于CSocket我不熟
我在同一个线程中建立几个CSocket对象,那么哪些数据是“共同的数据区”呢? 熟悉CSocket的高手也来看看呀!小弟在此谢过了!!!
没有公共的 定义全局变量,或者在堆里分配空间
to maxsuy(魔法兔子): 能说得详细一点嘛?
高手在那里???
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这类函数返回的临时对象。
azuo_lee(): 高!阁下能不能进一步阐述一下如何解决跨线程CSocket对象的使用? 小弟多谢啦!
azuo_lee解释的不错
hlh771(心宿):你也多说几句呀!
ok
我来学习一下!