CAsyncSocket的多线程问题

nightsuns 2004-12-03 10:25:11
一共两个线程,我要做到一个线程创建CAsyncSocket对象,另一个线程来释放CAsyncSocket对象,
但发现MFC的内部为和线程相关,怎么解决?

它内部总是:
_AFX_SOCK_THREAD_STATE* pState = _afxSockThreadState;
取得线程相关信息,再对SOCKET进行操作。
...全文
409 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
nightsuns 2004-12-06
  • 打赏
  • 举报
回复
谢谢各位的解答,现在我已经自己封装,感觉用起来比较放心。
oyljerry 2004-12-03
  • 打赏
  • 举报
回复
线程局部存储,传递对象来
kingzai 2004-12-03
  • 打赏
  • 举报
回复
MFC的SOCKET类(包括CAsyncSocket,CSocket)不能够跨线程使用。原因是MFC使用了TLS(线程局部存储来管理这些SOCKET对象。如果一定要跨线程传递一个SOCKET对象,必须调用其Detach和Attach函数,你可以这么解决
nightsuns 2004-12-03
  • 打赏
  • 举报
回复
回复人: jiangsheng(蒋晟.MSMVP2004Jan) ( ) 信誉:257 2004-12-03 10:53:00 得分: 0


不能跨线程访问CAsyncSocket之类使用了线程局部存储的程序


其实也不是跨线程,我会在第一个线程启动以后,将这些指针存入一个全局域中,在第二个线程
初始化的时候将之写入thread local中。不知道这种方法可行吗?
nightsuns 2004-12-03
  • 打赏
  • 举报
回复
那有什么好的解决方案没有?
蒋晟 2004-12-03
  • 打赏
  • 举报
回复
不能跨线程访问CAsyncSocket之类使用了线程局部存储的程序
nightsuns 2004-12-03
  • 打赏
  • 举报
回复
回复人: DentistryDoctor(雅克医生<改行做程序员了>) ( ) 信誉:172 2004-12-03 10:43:00 得分: 0


线程直接最好直接传送SOCKET,你可以先在A线程中先Deatch,然后在B线程中Attach,用完后再在A线程中Attach.


之所以开后台线程,就是要它轮询,前台可以做其它的事。前台也不维持消息循环。
DentistryDoctor 2004-12-03
  • 打赏
  • 举报
回复
线程直接最好直接传送SOCKET,你可以先在A线程中先Deatch,然后在B线程中Attach,用完后再在A线程中Attach.
nightsuns 2004-12-03
  • 打赏
  • 举报
回复
回复人: danyueer(淡月儿:清水上的足音) ( ) 信誉:115 2004-12-03 10:27:00 得分: 0


CAsyncSocket自身采用了多线程,你用多线程来进行操作,容易出现问题


我是想做到跟GUI无关,我的后台线程只是轮询所有的监听端口,如果有连接就会新建一个对象。
不知道有什么其它的更好的方法吗?
nightsuns 2004-12-03
  • 打赏
  • 举报
回复
CAsyncSocket* PASCAL CAsyncSocket::LookupHandle(SOCKET hSocket, BOOL bDead)
{
CAsyncSocket* pSocket;
_AFX_SOCK_THREAD_STATE* pState = _afxSockThreadState;
if (!bDead)
{
pSocket = (CAsyncSocket*)
pState->m_pmapSocketHandle->GetValueAt((void*)hSocket);
if (pSocket != NULL)
return pSocket;
}
else
{
pSocket = (CAsyncSocket*)
pState->m_pmapDeadSockets->GetValueAt((void*)hSocket);
if (pSocket != NULL)
return pSocket;
}
return NULL;
}

这是一段MFC的源码,我准备在第二个线程里面,用主线程的
pState->m_pmapDeadSockets
pState->m_pmapSocketHandle
来替换第二个线程的值,
不知道可行吗?
kingzai 2004-12-03
  • 打赏
  • 举报
回复
用CAsyncSocket的话,建议你在主线程中创建Socket,不然问题会很多。
因为CAsyncSocket使用了一个与主线程有关的隐藏的窗口来实现回调过程
DentistryDoctor 2004-12-03
  • 打赏
  • 举报
回复
这是为了实现从SOCKET到CAsyncSocket*,这个不是线程安全的。
因为_afxSokThreadState实际上是线程局部存储的。
danyueer 2004-12-03
  • 打赏
  • 举报
回复
CAsyncSocket自身采用了多线程,你用多线程来进行操作,容易出现问题
weiziyuner 2004-12-03
  • 打赏
  • 举报
回复
对 线程局部存储 不熟,不过对于socket有个原则就是:
能不要用CSocket和CAsyncSocket类就尽量不要用,因为它们不是类型安全的
到现在为止我没有发现有什么地方一定要用上面两个类的地方,自己封装一个类
照样可以工作的很好:)
nightsuns 2004-12-03
  • 打赏
  • 举报
回复
其实,和是否是thread local关系不大,关键是前台线程不会主动地去检测是否有后台
对象过来,我现在是想在后台线程里面检测和构造对象,然后放入一个线程共享的数组
里面。

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧