c++ - Boost 字符串处理函数是否曾经持有全局锁?

标签 c++ boost

How to convert std::string_view to double? 的回答如下:

Apparently, many Boost functions use string streams internally, which has a lock on the global OS locale. So they have terrible multi-threaded performance


但是,我找不到有关此问题的任何其他内容。这是真的吗?

最佳答案

“字符串处理函数”过于笼统,因此具有误导性。
有一组有限的库可以进行区域感知转换。
在 IOStreams 方面只指定了一个(据我所知):Boost Lexical Cast .因此,它们将受语言环境的底层标准库实现的约束。他们可能会使用锁。
为了更完整:

  • Boost Locale - 显然 - 区域设置感知但不需要使用全局区域设置,因此可能使用来自 libc 的更现代的线程安全区域设置函数。 为了以线程安全的方式更改语言环境参数,POSIX 定义了 newlocale() , uselocale()freelocale()职能。
  • Boost Convert 2.0the option使用 Lexical CastStream .当您这样做时,情况再次与使用的标准库实现相同。
  • String Algorithms 的子集库是区域设置感知的,例如用于不区分大小写的比较或大小写转换。我想说,如果您将它们与全局语言环境一起使用,您可能会期望标准库的实现质量再次成为决定因素。

  • 综上所述:
  • 仔细考虑为什么要使用区域感知解析。有时你不需要那个 - 例如。因为没有差异(解析整数)或语言环境本身是固定的(使用例如 Boost Spirit Qi 或 Boost Convert,或者实际上是 std::stoi 和 friend 或 c++17 from_chars 这实际上是有保证的成为金钱能买到的最好的表演
  • 当您需要了解区域设置时,请考虑这些选项。考虑使用线程私有(private)的语言环境实例(因此它带有单独的方面)和测量 您的表现:多衡量,少担心。
  • 关于c++ - Boost 字符串处理函数是否曾经持有全局锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63835752/

    相关文章:

    c++ - 为什么当我将一个指针字符串初始化为另一个非指针字符串时编译失败?

    c++ - 安卓 NDK 互斥量

    c++ - boost::property_tree::info_parser 在值的空格处中断

    c++ - 用 std::launch::sync 模拟 std::async?

    c++ - 当 asyn_read 可能在 boost.ASIO 中进行时销毁套接字对象是否安全?

    c++ - boost::array of boost::reference_wrapper 未编译

    c++ - 为什么链接到动态库时静态库中的模板化函数会崩溃?

    c++ - 在 std 容器线程上调用 size() 是否安全?

    c++ - 在 C++ 代码上更改所有 io 的局部变量

    c++ - boost 或 Visual Studio 2010 中的内存泄漏