stringstream

来源:互联网 发布:淘宝提升动态评分 编辑:程序博客网 时间:2024/06/16 16:20

在工作中发现同样的问题,在多线程时会死机在to_string中目前是通过逐个特化,其实也就是不用模板来解决该问题

备注:

该问题只在指定的机器上出现,其他机器上都没测试出来

windows server 2012 64位操作系统,上面安装有VS 2012 ,我们的软件默认会要求安装VS 2005 运行库(DLL也是用2005编译的),故目前猜测是版本不一致导致,希望有高手来进一步解答!


{"subject":"[合集] 请帮忙看一下stringstream的一个问题","content":"发信人: dp2 (===---===), 信区: CPlusPlus 
标  题: [合集] 请帮忙看一下stringstream的一个问题 
发信站: 水木社区 (Sat Dec 12 19:50:59 2009), 站内 
  
☆—————————————————————————————————————☆ 
   
leeight (leeight) 于 (Sun Aug 23 21:08:37 2009) 提到: 
  
代码里面有个函数是: 
template <class T> 
inline std::string to_string (const T& t) 

     std::stringstream ss; 
     ss << t; 
     return ss.str(); 

  
不过这个函数有时候在执行<<的时候core dump了,堆栈信息如下: 
  
#0  0x000000302af67f4f in malloc_consolidate () from /lib64/tls/libc.so.6 
No symbol table info available. 
#1  0x000000302af68f17 in _int_malloc () from /lib64/tls/libc.so.6 
No symbol table info available. 
#2  0x000000302af6ac52 in malloc () from /lib64/tls/libc.so.6 
No symbol table info available. 
#3  0x000000302d3af59a in operator new () from /usr/lib64/libstdc++.so.6 
No symbol table info available. 
#4  0x000000302d3901de in std::string::_Rep::_S_create () from  
/usr/lib64/libstdc++.so.6 
No symbol table info available. 
#5  0x000000302d39027c in std::string::_Rep::_M_clone () from  
/usr/lib64/libstdc++.so.6 
No symbol table info available. 
#6  0x000000302d390723 in std::string::reserve () from  
/usr/lib64/libstdc++.so.6 
No symbol table info available. 
#7  0x000000302d38ccef in std::basic_stringbuf<char, std::char_traits<char>,  
std::allocator<char> >::overflow () from /usr/lib64/libstdc++.so.6 
No symbol table info available. 
#8  0x000000302d38e8cf in std::basic_streambuf<char, std::char_traits<char>  
>::xsputn () from /usr/lib64/libstdc++.so.6 
No symbol table info available. 
#9  0x000000302d3814ea in std::num_put<char, std::ostreambuf_iterator<char,  
std::char_traits<char> > >::_M_insert_int<long> () from  
/usr/lib64/libstdc++.so.6 
No symbol table info available. 
#10 0x000000302d3815f9 in std::num_put<char, std::ostreambuf_iterator<char,  
std::char_traits<char> > >::do_put () from /usr/lib64/libstdc++.so.6 
No symbol table info available. 
#11 0x000000302d386e40 in std::ostream::operator<< () from  
/usr/lib64/libstdc++.so.6 
No symbol table info available. 
#12 0x000000000040e8ec in to_string<int> (t=@0x41dd9ffc) at fui_tools.h:70 
         ss = <incomplete type> 
.... 
  
我看了一下地址0x41dd9ffc的值是2, 我不清楚什么地方可能导致出错呢? 
  
g++的版本是“g++ (GCC) 3.4.5 20051201 (Red Hat 3.4.5-2)” 
  
多线程的程序,每个线程内部会调用to_string这个方法 
  
  
☆—————————————————————————————————————☆ 
   
dp2 (我爱你,我的祖国) 于 (Sun Aug 23 21:11:54 2009) 提到: 
  
stringstream内存泄露?你密切关注一下运行过程中的内存使用情况,是不是一直增长到死 
【 在 leeight (leeight) 的大作中提到: 】 
: 代码里面有个函数是: 
: template <class T> 
: inline std::string to_string (const T& t) 
: ................... 
  
☆—————————————————————————————————————☆ 
   
leeight (leeight) 于 (Sun Aug 23 22:30:36 2009) 提到: 
  
gdb显示的信息是 
  
Program terminated with signal 7, Bus error. 
【 在 dp2 (我爱你,我的祖国) 的大作中提到: 】 
stringstream内存泄露?你密切关注一下运行过程中的内存使用情况,是不是一直增长 
到死 
  
☆—————————————————————————————————————☆ 
   
skydoom (风险管理金融工程) 于 (Sun Aug 23 22:54:44 2009) 提到: 
  
先在单线程测试一下你的函数。。。如果没有问题的话,那再测试多线程。 
【 在 leeight (leeight) 的大作中提到: 】 
: 代码里面有个函数是: 
: template <class T> 
: inline std::string to_string (const T& t) 
: ................... 
  
☆—————————————————————————————————————☆ 
   
skydoom (风险管理金融工程) 于 (Sun Aug 23 23:27:22 2009) 提到: 
  
再看清楚了你的原贴,“有时候”。。。基本可以确定是多线程的问题了。在C++中,公共汽车出错一般都是内存操作的问题,比如尝试存取non-existent address或unaligned access. 
至于内存不足,倒是自己set handler来确定是不是这个问题。(从你的上下文看,不像是内存泄露的问题)。 
【 在 leeight (leeight) 的大作中提到: 】 
: 代码里面有个函数是: 
: template <class T> 
: inline std::string to_string (const T& t) 
: ................... 
  
☆—————————————————————————————————————☆ 
   
leeight (leeight) 于 (Mon Aug 24 00:56:46 2009) 提到: 
  
应该不是内存泄漏的问题。机器的内存还很富余,我再从多线程方面考虑一下。 
  
多谢 
【 在 skydoom (风险管理金融工程) 的大作中提到: 】 
: 再看清楚了你的原贴,“有时候”。。。基本可以确定是多线程的问题了。在C++中,公 
共汽车出错一般都是内存操作的问题,比如尝试存取non-existent address或 
unaligned access. 
: 至于内存不足,倒是自己set handler来确定是不是这个问题。(从你的上下文看,不像 
是内存泄露的问题)。 
  
☆—————————————————————————————————————☆ 
   
skydoom (风险管理金融工程) 于 (Mon Aug 24 02:14:13 2009) 提到: 
  
多线程是比较难调试的,如果可以在调试器上运行调试版本就最好了,可以在出现错误的地方看stack trace 和 thread information. 
【 在 leeight (leeight) 的大作中提到: 】 
: 应该不是内存泄漏的问题。机器的内存还很富余,我再从多线程方面考虑一下。 
: 多谢 
: 共汽车出错一般都是内存操作的问题,比如尝试存取non-existent address或 
: ...................  
☆—————————————————————————————————————☆ 
   
yingbom (膺博) 于 (Mon Aug 24 10:58:19 2009) 提到: 
  
stringstream 不是threadsafe的,至少往里写不是。 
【 在 leeight (leeight) 的大作中提到: 】 
: 代码里面有个函数是: 
: template <class T> 
: inline std::string to_string (const T& t) 

☆—————————————————————————————————————☆ 
   
skydoom (风险管理金融工程) 于 (Mon Aug 24 11:09:33 2009) 提到: 
  
相信楼主不是同时在不同的线程对同一个stringstream对象操作吧。。。估计基本的锁还是会有的。 
【 在 yingbom (膺博) 的大作中提到: 】 
stringstream 不是threadsafe的,至少往里写不是。 
  
☆—————————————————————————————————————☆ 
   
shader (hey) 于 (Mon Aug 24 16:13:52 2009) 提到: 
  
所以很奇怪…… 
【 在 skydoom (风险管理金融工程) 的大作中提到: 】 
: 相信楼主不是同时在不同的线程对同一个stringstream对象操作吧。。。估计基本的锁还是会有的。 
  
☆—————————————————————————————————————☆ 
   
skydoom (风险管理金融工程) 于 (Mon Aug 24 20:19:19 2009) 提到: 
  
这是lz的马甲? 
要查这种问题,不单单是锁,还有内存操作,看前面有没有非法的操作,这些都可能引起后面随机的错误的。如果有辅助工具的话就简单一点。 
【 在 shader (hey) 的大作中提到: 】 
: 所以很奇怪…… 
  
☆—————————————————————————————————————☆ 
   
shader (hey) 于 (Tue Aug 25 13:00:19 2009) 提到: 
  
我不是楼主的马甲,谢谢你对我的帖子感兴趣  
【 在 skydoom (风险管理金融工程) 的大作中提到: 】 
: 标  题: Re: 请帮忙看一下stringstream的一个问题 
: 发信站: 水木社区 (Mon Aug 24 20:19:19 2009), 站内 
:   
: 这是lz的马甲? 
: 要查这种问题,不单单是锁,还有内存操作,看前面有没有非法的操作,这些都可能引起后面随机的错误的。如果有辅助工具的话就简单一点。 
: 【 在 shader (hey) 的大作中提到: 】 
: : 所以很奇怪…… 
:   
: -- 
: InsideRisk.NET 风险视界 
:   
※ 来源:·水木社区 http://newsmth.net·[FROM: 67.204.32.*] 
  
☆—————————————————————————————————————☆ 
   
leeight (leeight) 于 (Tue Aug 25 16:31:46 2009) 提到: 
  
不同的线程,不同的stringstream对象,每次调用to_string()的时候,都会生成的一 
个新的 
【 在 skydoom (风险管理金融工程) 的大作中提到: 】 
: 相信楼主不是同时在不同的线程对同一个stringstream对象操作吧。。。估计基本的 
锁还是会有的。 
  
☆—————————————————————————————————————☆ 
   
skydoom (风险管理金融工程) 于 (Tue Aug 25 20:54:05 2009) 提到: 
  
在上面的函数是的。不过没有完全的代码,人家很难确定其他地方有没有类似的问题。 
【 在 leeight (leeight) 的大作中提到: 】 
: 不同的线程,不同的stringstream对象,每次调用to_string()的时候,都会生成的 
: 一个新的 
  
☆—————————————————————————————————————☆ 
   
ClassyK (二万五千里) 于 (Tue Aug 25 22:16:08 2009) 提到: 
  
  
没找到楼主的问题 
  
不过我今天在自己的代码里发现了一个类似代码的问题,虽然问题完全不一样 
  
我的问题就出在 
ss << t 
当t是包含空格或者\\n等字符的字符串( char* or string)时,这个输入被截断了。。 
  
最后只要又写了4个特化函数。 
  
  
【 在 leeight (leeight) 的大作中提到: 】 
: 代码里面有个函数是: 
: template <class T> 
: inline std::string to_string (const T& t) 
: ................... 
  
","ajax_st":1,"ajax_code":"0005","ajax_msg":"操作成功"}

转载自:

http://cache.baiducontent.com/c?m=9d78d513d98207ef03b1c13f4b568035464380122ba1d6020ea4843e91732d43506793ac57560773d3d27c1616df4d4b9df22173471451c38cbefc5dadba85595e9c60742e13dc0754910eaeb85b388465d54de9d845b0ffb16dd5f4c5d3a808048c4e590eddb0cc051d439434b6432cb7fdc71f025e64fefa3113e8597029eb7600eb00bba1256e0081828c0113813dd01645c4ec22b03912c162c6415c6526fe0bf01f512130941e7aa11a6a55d4b019b03d794723c248b1bbcaa1eb4f8ca89526988dc8af2b9764e5cfeefe7a557025a725&p=87769a47ca934eab5db3f820567a&newp=8b2a9753cd9b52ff57e99136164092695803ed633fddd603648c80&user=baidu&fm=sc&query=stringstream+%D4%CB%D0%D0%BF%E2+%B6%E0%CF%DF%B3%CC&qid=&p1=30

0 0
原创粉丝点击