免费注册 查看新帖 |

Chinaunix

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

[函数] STL自己的函数也会出错!!? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-07-13 15:17 |只看该作者 |倒序浏览
本人在做一个压力测试的时候发现错误,最后找了半天发现竟然是STL本身函数的问题,下面是出错部分代码,很简单:
A线程
while(!sendqueue.empty())
{                                       
   try
  {
        string &tempbuf = handlequeue.front();
  }
catch (...)
{
  MessageBox(0,"handlequeue.front()存在问题",0,0);
  }
.....
                                               
问题就出在front函数,handlequeue是一个queue<string>;的队列,B线程在往里面push数据,A线程在取数据,当处理极快的时候B线程没有异常,会出现handlequeue.front()异常抛出!        是什么原因造成的?怎么解决呢?

论坛徽章:
0
2 [报告]
发表于 2004-07-13 15:34 |只看该作者

STL自己的函数也会出错!!?

起初我想是不是B线程处理太快以至于handlequeue 的空间扩张太快而遇到问题,但是B线程应该不会比A线程更快,因为B线程里处理流程比较长执行函数比较多。后来我想难道 queue不是线程安全的?但是push只是向尾部插入,而front是从头布取出,如果取完了,就为空(当取出的数据处理了以后我用pop了),等待信号灯置亮(每次push的时候我会把一个信号置亮,等处理完既handlequeue为空的时候把信号熄灭),不过可能问题都不是上者。最奇怪的还是一旦出现front()的异常,就会永远停留在while中总是出现front异常,队列既不为空,front又不能成功,似乎整个handlequeue崩溃掉了。

论坛徽章:
0
3 [报告]
发表于 2004-07-13 16:32 |只看该作者

STL自己的函数也会出错!!?

STL不是线程安全的。你的同步可能有问题,说详细点。
至于STL代码是否正确,我可以说没有完全正确的代码,但是至少在这个层面上,应该不会错的。

论坛徽章:
0
4 [报告]
发表于 2004-07-13 16:46 |只看该作者

STL自己的函数也会出错!!?

stl不是线程安全的。因此不能在没有保护的情况下,在多线程环境中使用。

但是push只是向尾部插入,而front是从头布取出,如果取完了,就为空(当取出的数据处理了


没有什么但是。即使一个简单的全局变量加一的操作,如果没有专门的保护,在多线程环境中都有错误,更加别提什么push, pop了。[/quote]

论坛徽章:
0
5 [报告]
发表于 2004-07-13 16:54 |只看该作者

STL自己的函数也会出错!!?

见下贴

论坛徽章:
0
6 [报告]
发表于 2004-07-13 17:06 |只看该作者

STL自己的函数也会出错!!?

B线程中关于这段的代码       
   readysend=HandleMsgFunc1(recvbuffer.c_str()); //  readysend是string全局变量
if(!readsend.empty())
{
      handledqueue.push(readsend);
      SetEvent(SendEvent);       
}
A线程:
while(WAIT_OBJECT_0 == WaitForSingleObject(m_hHandleEvent,INFINITE))
{
while(!sendqueue.empty())
{
try
{
string &tempbuf = handlequeue.front();
}
catch (...)
{
MessageBox(0,"handlequeue.front()存在问题",0,0);
}
....
handledqueue.pop();
ResetEvent(sendevent);

}
B线程是从网络接受来的消息进行处理后放进一个已处理队列,
A线程负责从这个已处理队列中取出元素来发送到网络。

压力测试:做一个工具,死循环发送100字节的随机内容的包给接受的服务器,中途不sleep,但只有从网络受到回复才做下一次发送,也就是说接受和发送是阻塞的。一个工具一秒大约能收发共500-1000条消息;服务器端只是把收到的包简单作了一个回复。结果发现,当同时开几个工具一起向一台服务器发送的时候,出现问题,问题就出在STL 的队列front()函数!但抛出异常的时间不等,有的时候30秒,有的时候1,2分钟,但不超过3分钟,一般开3-4个压力工具就出现问题。

论坛徽章:
0
7 [报告]
发表于 2004-07-13 17:06 |只看该作者

STL自己的函数也会出错!!?

实在看不懂,花括号好像不匹配吧?

论坛徽章:
0
8 [报告]
发表于 2004-07-13 17:11 |只看该作者

STL自己的函数也会出错!!?

括号不会少的,可能是我贴少了,程序就是这样,帮我分析一下

论坛徽章:
0
9 [报告]
发表于 2004-07-13 17:20 |只看该作者

STL自己的函数也会出错!!?

同意 我不懂C++ 的观点
虽然没有看你的source,不好下结论,但是问题出在你自己代码的可能性应该是远远大于stl自己有问题的可能性。
问题十之八九出在多线程的同步上,建议仔细看一下event的相关内容

论坛徽章:
0
10 [报告]
发表于 2004-07-13 17:44 |只看该作者

STL自己的函数也会出错!!?

感谢各位大大的意见!目前在原来信号的基础上加了互斥,以控制对队列的同时访问,压力测试正在进行中,目前4个压力工具同时开还没出现问题,大约一秒1500-2000条消息
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP