Является ли boost :: lexical_cast поточно-ориентированным?

Я на самом деле не могу найти ответ на этот вопрос в документации Boost. Я немного параноик по поводу использования atof в многопоточной среде, поэтому одним из предложений было заменить вызов lexical_cast, Является lexical_cast потокобезопасный?

2

Решение

Параллельные звонки на lexical_cast безопасны Но обратите внимание, что это зависит (по крайней мере, для моей установленной версии Boost) от текущей установленной локали C ++. Доступ к установленной локали C ++ (а также C) должен быть синхронизирован пользователем вручную. Увидеть Гонки данных раздел Вот. Так, например, одновременные вызовы lexical_cast а также std::locale::global небезопасны. Несмотря на это, считается плохой практикой изменять установленный язык C / C ++ иначе, чем при запуске программы.

2

Другие решения

Да, boost::lexical_cast не изменяет входную строку каким-либо образом и создает новый вывод, если выполняется из одной и той же строки из нескольких потоков.

Это создает stringstream который сам по себе не является потокобезопасным, то есть не может совместно использоваться потоками без синхронизации, но будет использовать другой stringstream объект в каждом потоке.

У меня проблема с lexical_cast вот почему я избегаю его использования — это полная бесполезность создаваемого исключения (bad_cast без контекста). Однако это отдельная проблема, а не безопасность потоков.

Другая проблема (ограничение) с lexical_cast заключается в том, что он будет использовать только язык Си (классический). Так что, если у вас есть свой собственный фасет, возможно, для даты и времени, и вы хотите использовать в нем lexical_cast, у вас может возникнуть соблазн изменить классический языковой стандарт в качестве обходного пути, и тогда он перестанет быть поточно-ориентированным, если не будет сделано прямо в начале.

В действительности, если вы анализируете файл, вам, вероятно, будет лучше использовать любой из boost::spirit если он имеет конкретную грамматику или boost::serialize или даже обычный istream. по факту boost::lexical_cast было бы крайне неэффективно для этой цели, поскольку это создает новый поток для каждого токена.

3

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

-2
По вопросам рекламы [email protected]