Я на самом деле не могу найти ответ на этот вопрос в документации Boost. Я немного параноик по поводу использования atof
в многопоточной среде, поэтому одним из предложений было заменить вызов lexical_cast
, Является lexical_cast
потокобезопасный?
Параллельные звонки на lexical_cast
безопасны Но обратите внимание, что это зависит (по крайней мере, для моей установленной версии Boost) от текущей установленной локали C ++. Доступ к установленной локали C ++ (а также C) должен быть синхронизирован пользователем вручную. Увидеть Гонки данных раздел Вот. Так, например, одновременные вызовы lexical_cast
а также std::locale::global
небезопасны. Несмотря на это, считается плохой практикой изменять установленный язык C / C ++ иначе, чем при запуске программы.
Да, boost::lexical_cast
не изменяет входную строку каким-либо образом и создает новый вывод, если выполняется из одной и той же строки из нескольких потоков.
Это создает stringstream
который сам по себе не является потокобезопасным, то есть не может совместно использоваться потоками без синхронизации, но будет использовать другой stringstream
объект в каждом потоке.
У меня проблема с lexical_cast
вот почему я избегаю его использования — это полная бесполезность создаваемого исключения (bad_cast без контекста). Однако это отдельная проблема, а не безопасность потоков.
Другая проблема (ограничение) с lexical_cast заключается в том, что он будет использовать только язык Си (классический). Так что, если у вас есть свой собственный фасет, возможно, для даты и времени, и вы хотите использовать в нем lexical_cast, у вас может возникнуть соблазн изменить классический языковой стандарт в качестве обходного пути, и тогда он перестанет быть поточно-ориентированным, если не будет сделано прямо в начале.
В действительности, если вы анализируете файл, вам, вероятно, будет лучше использовать любой из boost::spirit
если он имеет конкретную грамматику или boost::serialize
или даже обычный istream. по факту boost::lexical_cast
было бы крайне неэффективно для этой цели, поскольку это создает новый поток для каждого токена.
В документации ничего не говорится о безопасности потоков, поэтому можно предположить, что это не так. я нашел этот список рассылки это, кажется, поддерживает это понятие.