返回首页 - 搜索更多 -
主  题:
请教高手:何谓线程安全?怎么理解CSocket不是线程安全的?谢谢!!


回复人: happydeer(小鹿) ( ) 信誉:99 2001-09-05 08:44:30Z 得分:0
?

高手请指点一二!
Top
回复人: Great_Bug(想当软件工程师的代码工人,失业中...) ( ) 信誉:100 2001-09-05 08:52:22Z 得分:0
?

我是来听课的
Top
回复人: zhanghy(zhanghy) ( ) 信誉:100 2001-09-05 09:00:54Z 得分:0
?

线程安全就是线程间不会发生对相同数据区的访问冲突。
编写线程安全类的最简单的方法是用同步对象,Windows系统有几个用来处理线程同步和互斥的内核对象,象Semaphore,Mutex,Event一类的。
关于CSocket我不熟
Top
回复人: happydeer(小鹿) ( ) 信誉:99 2001-09-05 09:17:17Z 得分:0
?

我在同一个线程中建立几个CSocket对象,那么哪些数据是“共同的数据区”呢?
熟悉CSocket的高手也来看看呀!小弟在此谢过了!!!
Top
回复人: maxsuy(魔法兔子) ( ) 信誉:100 2001-09-05 09:30:09Z 得分:0
?

没有公共的
定义全局变量,或者在堆里分配空间
Top
回复人: happydeer(小鹿) ( ) 信誉:99 2001-09-05 10:45:40Z 得分:0
?

to maxsuy(魔法兔子):
能说得详细一点嘛?
Top
回复人: happydeer(小鹿) ( ) 信誉:99 2001-09-05 13:27:01Z 得分:0
?

高手在那里???
Top
回复人: azuo_lee() ( ) 信誉:100 2001-09-05 13:52:04Z 得分:45
?

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这类函数返回的临时对象。
Top
回复人: happydeer(小鹿) ( ) 信誉:99 2001-09-05 16:53:43Z 得分:0
?

azuo_lee():
高!阁下能不能进一步阐述一下如何解决跨线程CSocket对象的使用?
小弟多谢啦!
Top
回复人: hlh771(心宿) ( ) 信誉:100 2001-09-05 17:14:13Z 得分:0
?

azuo_lee解释的不错
Top
回复人: happydeer(小鹿) ( ) 信誉:99 2001-09-06 09:52:13Z 得分:0
?

hlh771(心宿):你也多说几句呀!
Top
回复人: meifen(meifen) ( ) 信誉:100 2001-09-06 16:19:12Z 得分:0
?

ok
Top
回复人: cmpp() ( ) 信誉:100 2001-12-17 10:09:58Z 得分:0
?

我来学习一下!
Top

结贴 ,得分记录: azuo_lee (45)、