【问题标题】:Thread safe approach to setlocale()setlocale() 的线程安全方法
【发布时间】:2016-11-17 20:01:14
【问题描述】:

This paper 表示setlocale() 是线程不安全的。是否有任何线程安全的方法来设置语言环境。

我使用 C++ 进行编码,但如果有任何不同,C 库中的函数将使用语言环境。

这基本上就是我现在正在做的事情:

const char* loc_old = std::setlocale(ltype, 0);
std::setlocale(ltype, mylocale.c_str()); //change the locale
//call some C functions
std::setlocale(ltype, loc_old);          //restore the locale

解决方案必须是可移植的,而不是>=C++11

【问题讨论】:

  • 应用程序全局语言环境,没有。您必须实例化离散的 std::locale 对象,并将它们灌输到任何地方,以保证线程安全。既然 C++ 有 thread_local,那么应该有一个默认的 thread_local 语言环境,而新的执行 std::threads 从它们的父线程继承一个。
  • @SamVarshavchik : 不幸的是,thread_local 不适合我..

标签: c++ multithreading


【解决方案1】:

这里有一个很好的答案

Is setlocale thread-safe function?

基本上你,显然可以使用

uselocale

正如对所引用问题给出的答案之一的这个 sn-p 所暗示的那样

#include <xlocale.h>

locale_t loc = newlocale(LC_ALL_MASK, "nl_NL", NULL);
uselocale(loc);
freelocale(loc)
// Do your thing

可能还有其他方法可以解决您的问题。

【讨论】:

  • xlocale.h 是标准标头吗?
  • 可能不会。不过,它似乎确实可以在 Linux、Mac 和 Windows 上使用。如果您正在为微控制器等编写代码,这可能对您没有帮助。另一个选项只是使用某种锁,使用 setlocale,然后恢复到以前的值,然后释放锁。 uselocale() 似乎更容易使用。锁是我提到的引用问题的公认答案。
猜你喜欢
  • 2023-03-30
  • 2012-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-06
  • 2013-12-16
  • 1970-01-01
  • 2013-03-31
相关资源
最近更新 更多