2010-04-28 75 views
1

我有一个在Linux下开发的GCC 4.2应用程序,它使用了非常大量的stringstream来打包和打开通过线路发送的数据。 (因为我使用的网格API要求它)。在Linux下,一切都很好,但是当我部署到SunOS(运行SPARC的v5.10)并使用GCC 3.4.6进行编译时,应用程序会在达到使用字符串流的位置时挂起。C++ std :: stringstream看起来会导致线程挂起或死在SunOS下

****添加新信息9/7/2010 **** 所以我仍然没有解决这个问题,但经过很多修补之后我终于找到了线索。事实上,我认为我发现了这个问题,但我不知如何解决这个问题!见下面链接器输出:

ld: warning: symbol `typeinfo for std::basic_iostream<char, std::char_traits<char> >' has differing sizes: 
     (file /home/roony/dssdk/cppdriver/lib/libdsDriverGCC3.so value=0x28; file /usr/sfw/lib/libstdc++.so value=0x20); 
     /home/roony/dssdk/cppdriver/lib/libdsDriverGCC3.so definition taken 

因此警告说,有在的iostream等两个库,但如何解决,或覆盖一个或另一个之间的定义不匹配.. ****结束新信息****

详细信息:主线程接受来自客户端的请求并启动一个新的pthread来处理每个请求。子线程使用stringstream来打包数据。当子线程到达那一点时,它似乎挂起一秒钟然后死亡。主线程不受影响。

stringstream和GCC 3.4.6或SunOS或SPARC是否存在任何已知问题?我还没有找到任何东西...

任何人都可以提出一个更好的方法来打包和解包大量的数据字符串或字节流?

道歉没有发布的代码,但这对我来说似乎比简单的语法错误更多的参与。所有相同的线程崩溃:

std::stringstream mystringstream; //not here 
mystringstream << "some data: "; //but here 

也就是说,我可以声明stringstream,但是当我尝试使用它时出了点问题。

+1

你在SunOS上怎么解决这个问题?你可以尝试从GCC4.2中实现'stringstream'(我猜,它会是'sstream'和'iostream')并在你的3.4.6编译器中使用它。你可以改变编译器。 – 2010-04-28 16:15:34

回答

1

您可能想要放入流中的“某些数据”无效(例如,已经释放或未正确分配的...),或者数据被另一个线程同时修改。

0

关于POSIX合规性,我在SunOS上工作真的很不幸。但那可能既不是这里,也不是那里。

我想到的最直接的事情是尝试增加您的线程的堆栈大小。也许你正在SunOS上堆积如山。 Linux有一个非常大和慷慨的默认堆栈大小。我不确定SunOS。