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

したがって、警告は、2 つのライブラリ間で iostream などの定義に不一致があることを示していますが、どちらか一方を修正またはオーバーライドする方法.. ****新しい情報の終わり****

詳細: メイン スレッドはクライアントからの要求を受け取り、新しい pthread を開始して各要求を処理します。子スレッドは、stringstreams を使用してデータをパックします。子スレッドがそのポイントに到達すると、1 秒間ハングしてから終了するように見えます。メインスレッドは影響を受けません。

stringstream と GCC 3.4.6 または SunOS または SPARC に関する既知の問題はありますか? まだ何も見つかりませんでした...

大量のデータを文字列またはバイトストリームにパックおよびアンパックするより良い方法を誰かが提案できますか?

コードを投稿していないことをお詫びしますが、これは単純な構文エラーよりも複雑なようです。それでも、スレッドはクラッシュします。

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

つまり、stringstream を宣言することはできますが、それを使用しようとすると何か問題が発生します。

4

2 に答える 2

1

おそらく、ストリームに入れたい「一部のデータ」が無効である(たとえば、すでに解放されchar*ているか、適切に割り当てられていないなど)か、データが別のスレッドによって同時に変更されています。

于 2010-04-28T16:18:50.063 に答える
0

POSIXコンプライアンスに関して、SunOSでの作業は本当に不運でした。しかし、それはここにもそこにもないかもしれません。

私の頭に浮かぶ最も直接的なことは、スレッドのスタックサイズを増やしてみることです。おそらく、SunOSのスタックが不足しています。Linuxには、非常に大きくて寛大なデフォルトのスタックサイズがあります。SunOSについてはよくわかりません。

于 2010-06-09T16:34:47.217 に答える