C ++ std :: stringstream, по-видимому, заставляет поток зависать или умирать под SunOS - PullRequest
1 голос
/ 28 апреля 2010

У меня есть приложение, разработанное под Linux с GCC 4.2, которое довольно интенсивно использует потоковые потоки для упаковки и развертывания данных, передаваемых по проводам. (Потому что Grid API, который я использую, требует этого). Под Linux все нормально, но когда я развертываюсь в SunOS (v5.10 с SPARC) и компилирую с GCC 3.4.6, приложение зависает, когда достигает точки, в которой используются струнные потоки.

**** Новая информация добавлена ​​07.09.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 и GCC 3.4.6 или SunOS или SPARC? Я еще ничего не нашел ...

Кто-нибудь может предложить лучший способ упаковки и распаковки больших объемов данных в виде строк или байтов?

Извините за то, что не публикуем код, но это мне кажется более сложным, чем простая синтаксическая ошибка. Все равно нить вылетает:

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

То есть я могу объявить поток строк, но когда я пытаюсь его использовать, что-то идет не так.

Ответы [ 2 ]

1 голос
/ 28 апреля 2010

Возможно, "некоторые данные", которые вы хотите поместить в поток, являются недопустимыми (например, уже освобождены или char* s не распределены должным образом / ...), или данные изменяются другим потоком в тот же время.

0 голосов
/ 09 июня 2010

Мне действительно не повезло, работая над SunOS в отношении соответствия POSIX. Но это может быть ни здесь, ни там.

Самое непосредственное, что приходит мне в голову, это попытаться увеличить размер стека для ваших потоков. Возможно, у вас не хватает стека в SunOS. У Linux очень большой и большой размер стека по умолчанию. Я не уверен насчет SunOS.

...