Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Boost字符串处理函数是否拥有全局锁?_C++_Boost - Fatal编程技术网

C++ Boost字符串处理函数是否拥有全局锁?

C++ Boost字符串处理函数是否拥有全局锁?,c++,boost,C++,Boost,对该问题的答复如下: 显然,许多Boost函数在内部使用字符串流,这对全局操作系统语言环境有一个锁定。因此,它们具有糟糕的多线程性能 但是,我找不到关于这个问题的任何其他信息。这是真的吗?“字符串处理函数”过于泛化,因此具有误导性 有一组有限的库可以进行区域设置感知转换 就我所知,IOStreams中只指定了一个:。因此,它们将受制于locale的底层标准库实现。他们可能会使用锁 更完整地说: Boost Locale显然是区域设置感知的,但不需要使用全局区域设置,因此可能使用来自libc的更

对该问题的答复如下:

显然,许多Boost函数在内部使用字符串流,这对全局操作系统语言环境有一个锁定。因此,它们具有糟糕的多线程性能

但是,我找不到关于这个问题的任何其他信息。这是真的吗?

“字符串处理函数”过于泛化,因此具有误导性

有一组有限的库可以进行区域设置感知转换

就我所知,IOStreams中只指定了一个:。因此,它们将受制于locale的底层标准库实现。他们可能会使用锁

更完整地说:

  • Boost Locale显然是区域设置感知的,但不需要使用全局区域设置,因此可能使用来自libc的更现代的线程安全区域设置函数为了以线程安全的方式更改区域设置参数,POSIX定义了
    newlocale()
    uselocale()
    freelocale()
    函数。

  • 必须使用或。当您这样做时,情况再次与使用中的标准库实现相同

  • 库的子集是区域设置感知的,例如用于不区分大小写的比较或大小写转换。我想说,如果您将它们与全局语言环境一起使用,您可以期望实现的标准库质量再次成为决定因素

鉴于上述情况:

  • 仔细想想为什么要使用区域设置感知解析。有时你不需要它-例如,因为没有方差(解析整数),或者区域设置本身是固定的(例如使用Boost Spirit Qi或Boost Convert,或者确实使用
    std::stoi
    和friends,或者c++17,这实际上是金钱可以买到的最好的性能

  • 当您需要区域设置意识时,考虑选项。考虑使用线程私有区域设置实例(因此它与单独的方面一起注入)和<强>度量< /强>您的性能:测量更多,更少担心。