我有一个在 Linux 下使用 GCC 4.2 开发的应用程序,它大量使用字符串流来包装和解包通过网络发送的数据。 (因为我使用的 Grid API 需要它)。在 Linux 下一切正常,但是当我部署到 SunOS(v5.10 运行 SPARC)并使用 GCC 3.4.6 编译时,应用程序在到达使用字符串流的点时挂起。
**** 新信息添加于 2010 年 9 月 7 日**** 所以我仍然没有解决这个问题,但经过大量修改后,我终于找到了线索。事实上,我认为我发现了问题,但我不知道如何解决它!请参阅下面的链接器输出:
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 来处理每个请求。子线程使用stringstreams打包数据。当子线程到达那个点时,它似乎会挂起一秒钟然后死掉。主线程不受影响。
stringstream 和 GCC 3.4.6 或 SunOS 或 SPARC 是否存在任何已知问题?我还没有找到任何东西......
谁能建议一种更好的方法来打包和解包大量数据字符串或字节流?
很抱歉没有发布代码,但这对我来说似乎比简单的语法错误更复杂。尽管如此,线程崩溃了:
std::stringstream mystringstream; //not here
mystringstream << "some data: "; //but here
也就是说,我可以声明字符串流,但是当我尝试使用它时出现问题。
最佳答案
可能您要放入流中的“某些数据”无效(例如已经释放或未正确分配的char*
/...)或数据被修改同时使用不同的线程。
关于C++ std::stringstream 似乎导致线程在 SunOS 下挂起或死亡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2731221/