c++ - C++ 中线程特定的语言环境操作

标签 c++ thread-safety locale

是否有任何标准方法可以通过每个线程跨平台进行语言环境设置?我看到 xlocale 提供了 uselocale,但它在 Windows 中不受支持。有“_configthreadlocale(_ENABLE_PER_THREAD_LOCALE);”在 Windows 中,之后 setlocale 在每个线程的基础上工作。我的问题是,是否有一个库以独立于平台的方式提供这些特定于语言环境的操作???或者其他一些方法?

谢谢, 悟空。

最佳答案

我遇到了同样的问题,我最终为它写了一些小的交叉兼容性代码。我试图跟随 specification尽可能接近,但它确实有一些限制。

在此代码中 newlocale不允许您指定基本语言环境,您也不能混合类别掩码。但是对于不同语言环境之间的一些基本切换,这应该足够了。

// Locale Cross-Compatibility
#ifdef _WIN32
#define locale_t         _locale_t
#define freelocale       _free_locale

#define LC_GLOBAL_LOCALE ((locale_t)-1)
#define LC_ALL_MASK      LC_ALL
#define LC_COLLATE_MASK  LC_COLLATE
#define LC_CTYPE_MASK    LC_CTYPE
#define LC_MONETARY_MASK LC_MONETARY
#define LC_NUMERIC_MASK  LC_NUMERIC
#define LC_TIME_MASK     LC_TIME

// Base locale is ignored and mixing of masks is not supported
#define newlocale(mask, locale, base) _create_locale(mask, locale)

locale_t uselocale(locale_t new_locale)
{
    // Retrieve the current per thread locale setting
    bool bIsPerThread = (_configthreadlocale(0) == _ENABLE_PER_THREAD_LOCALE);

    // Retrieve the current thread-specific locale
    locale_t old_locale = bIsPerThread ? _get_current_locale() : LC_GLOBAL_LOCALE;

    if(new_locale == LC_GLOBAL_LOCALE)
    {
        // Restore the global locale
        _configthreadlocale(_DISABLE_PER_THREAD_LOCALE);
    }
    else if(new_locale != NULL)
    {
        // Configure the thread to set the locale only for this thread
        _configthreadlocale(_ENABLE_PER_THREAD_LOCALE);

        // Set all locale categories
        for(int i = LC_MIN; i <= LC_MAX; i++)
            setlocale(i, new_locale->locinfo->lc_category[i].locale);
    }

    return old_locale;
}
#endif

将该代码放入您的项目中,您将能够像这样在任何平台上切换每个线程的语言环境:

#include <locale.h>
#ifdef __APPLE__
#include <xlocale.h>
#endif

// Apply a new locale to this thread
locale_t locale = newlocale(LC_NUMERIC_MASK, "C", NULL);
locale_t old_locale = uselocale(locale);

// Print out some text
printf("Always use dot-decimal notation: %f", 1.5);

// Restore the global locale
uselocale(old_locale);
freelocale(locale);

关于c++ - C++ 中线程特定的语言环境操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6561723/

相关文章:

c++ - Direct Show graph - 如何获取当前的 fps?

java - 在 runOnUiThread 线程中修改我的 ArrayList 是否安全?

mysql - 如何在同一个 MySQL 命令中将日期字段格式化为不同的语言?

cocoa - Cocoa(Touch) 支持有限数量的货币

java - 如何从 Java Locale 获取风格化的语言/国家/地区代码

c++ - __USE_BSD 标志在哪里定义?

c++ - 语法错误 : unexpected $end at token "<EOF>" GLSL with any shader

c++ - 创建具有特定权限的线程c++

c# - 为什么 "lock" block 不起作用?

c# - 我需要 MemoryBarrier 和 ReaderWriterLockSlim 吗?