Является ли boost::lexical_cast поточно-ориентированным?
Я на самом деле не могу найти ответ на этот вопрос в документации Boost. Я немного параноик по поводу использования atof
в многопоточной среде, поэтому одним из предложений было заменить вызов lexical_cast
, Является lexical_cast
потокобезопасный?
3 ответа
Параллельные звонки на 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
было бы крайне неэффективно для этой цели, поскольку это создает новый поток для каждого токена.
В документации ничего не говорится о безопасности потоков, поэтому можно предположить, что это не так. Я нашел этот список рассылки, который, кажется, поддерживает это понятие.