多线程区域设置API介绍

众所周知setlocale不是线程安全的,但是C语言很多标准库函数依赖于setlocale。因此如果需要使用C语言编写多线程的程序,需要使用多线程区域设置API。

一般来说,在主线程里还是使用setlocale,只需要在工作线程里使用这些多线程区域设置API即可。

Visual C++使用_configthreadlocale和setlocale:

int _configthreadlocale( int per_thread_locale_type );
// 用法
// 设置本线程setlocale使用线程局部存储
int oldcfg = _configthreadlocale(_ENABLE_PER_THREAD_LOCALE);
// 设置本线程setlocale使用全局存储
int oldcfg = _configthreadlocale(_DISABLE_PER_THREAD_LOCALE);
// 仅获取旧配置
int oldcfg = _configthreadlocale(0);

Linux使用newlocale、uselocale、duplocale、freelocale:

extern locale_t newlocale (int __category_mask, const char *__locale,
			   locale_t __base) __THROW;
extern locale_t duplocale (locale_t __dataset) __THROW;
extern void freelocale (locale_t __dataset) __THROW;
extern locale_t uselocale (locale_t __dataset) __THROW;
// 用法
// 分配locale_t
locale_t userloc = newlocale(LC_ALL_MASK, "", 0);
locale_t cloc = newlocale(LC_ALL_MASK, "C", 0);
// 释放locale_t
freelocale(userloc);
// 设置本线程locale为全局setlocale
locale_t oldloc = uselocale(LC_GLOBAL_LOCALE);
// 设置本线程locale为分配的locale_t
locale_t oldloc = uselocale(userloc);
// 仅获取旧的本线程locale
locale_t oldloc = uselocale(0);
// 拷贝全局setlocale或分配的locale_t并修改(用法类似realloc)
locale_t tmploc1 = duplocale(LC_GLOBAL_LOCALE);
locale_t tmploc2 = duplocale(cloc);
locale_t userloc1 = newlocale(LC_CTYPE_MASK, "", tmploc1);
locale_t userloc2 = newlocale(LC_CTYPE_MASK, "", tmploc2);
if (!userloc1) freelocale(tmploc1);
if (!userloc2) freelocale(tmploc2);
发布了29 篇原创文章 · 获赞 1 · 访问量 3405

猜你喜欢

转载自blog.csdn.net/defrag257/article/details/103488141
今日推荐