1

我有一个使用 GCC 4.2 在 Linux 下开发的应用程序,它大量使用字符串流来包装和解包通过网络发送的数据。(因为我使用的 Grid API 需要它)。在 Linux 下一切都很好,但是当我部署到 SunOS(运行 SPARC 的 v5.10)并使用 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 来处理每个请求。子线程使用字符串流来打包数据。当子线程到达该点时,它似乎会挂起一秒钟然后死掉。主线程不受影响。

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

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

很抱歉没有发布代码,但这对我来说似乎比简单的语法错误更复杂。尽管如此,线程崩溃了:

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

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

4

2 回答 2

1

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

于 2010-04-28T16:18:50.063 回答
0

在 POSIX 合规性方面,我在 SunOS 上工作真的很倒霉。但这可能既不在这里也不在那里。

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

于 2010-06-09T16:34:47.217 回答