免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2328 | 回复: 9
打印 上一主题 下一主题

多线程问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-02-28 12:35 |只看该作者 |倒序浏览
class myClass : public ACE_Event_Handler
{
public:

//回调函数
int handle_input(ACE_HANDLE)
{
     m_sockfd.recv(buffer,1024,remoteAddr);
}

ACE_SOCK_Dgram m_sockfd;
};


这个是ACE写的代码,用来监听UDP端口,m_sockfd是用来接收数据的类似SOCKET的东西。
handle_input是回调函数,当有数据到达是被自动调用,好象是在一个新的线程执行的。

我的问题是 m_sockfd.recv(buffer,1024,remoteAddr);
这句会不会有问题,因为多个数据同时到达,那么handle_input是不是被同时调用。m_sockfd
被多个线程访问,也没有互斥。接收到的数据会不会有错?

论坛徽章:
0
2 [报告]
发表于 2007-02-28 13:57 |只看该作者
取决于你的 buffer 是如何分配的。如果 buffer 也是类成员,那么就会在多个线程间共享,并发时确实可能出错。

论坛徽章:
0
3 [报告]
发表于 2007-02-28 17:35 |只看该作者
buffer 是 handle_input内部的变量,不是类成员。
但m_sockfd是类成员。

这样写应该是错的?

论坛徽章:
0
4 [报告]
发表于 2007-02-28 21:40 |只看该作者
ACE真的不错!据说有著名的游戏引擎使用ACE的!

论坛徽章:
0
5 [报告]
发表于 2007-03-01 10:06 |只看该作者
不同线程不会重复读取到同一段内容,但是消息的交叉和分段需要程序自己控制。

论坛徽章:
0
6 [报告]
发表于 2007-03-01 10:16 |只看该作者
原帖由 apollolegend 于 2007-2-28 21:40 发表
ACE真的不错!据说有著名的游戏引擎使用ACE的!


what 引擎?

论坛徽章:
0
7 [报告]
发表于 2007-03-01 16:09 |只看该作者
汗。ace是网络编程框架,游戏引擎?

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
8 [报告]
发表于 2007-03-01 17:27 |只看该作者
是ICE吧..
每个handler肯定只监听一个端口..一个端口来的数据你就一个一个地收呗..ACE内部实现可能是类似select.
handle_input不可能同时调用..单线程

论坛徽章:
0
9 [报告]
发表于 2008-04-02 14:15 |只看该作者

回复 #8 cookis 的帖子

多线程不能使用 ACE_Event_Handler 吗?

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
10 [报告]
发表于 2008-04-02 15:04 |只看该作者
呵呵..好老的贴子..

如果你的Reactor 用的是select .那么不会出现这个问题的.
如果你的Reactor 用的是epoll. 那么不应该使用多线程..
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP