以文本方式查看主题 - 中文XML论坛 - 专业的XML技术讨论区 (http://bbs.xml.org.cn/index.asp) -- 『 C/C++编程思想 』 (http://bbs.xml.org.cn/list.asp?boardid=61) ---- 多线程处理和区域设置 (http://bbs.xml.org.cn/dispbbs.asp?boardid=61&rootid=&id=65749) |
-- 作者:卷积内核 -- 发布时间:8/11/2008 8:21:00 AM -- 多线程处理和区域设置 C 运行时库和标准 C++ 库都支持更改程序的区域设置。本主题讨论在多线程应用程序中使用这两个库的区域设置功能时出现的问题。 备注 要使用 C 运行时库更改区域设置,请使用 setlocale 函数。在以前版本的 Visual C++ 中,此函数始终修改整个应用程序中的区域设置。现在,支持在每线程基础上设置区域设置。这是使用 _configthreadlocale 函数实现的。要指定该 setlocale 仅应更改当前线程中的区域设置,请在该线程中调用 _configthreadlocale(_ENABLE_PER_THREAD_LOCALE)。相反,调用 _configthreadlocale(_DISABLE_PER_THREAD_LOCALE) 将导致该线程使用全局区域设置,对该线程中 setlocale 的任何调用将更改未显式启用每线程区域设置的所有线程中的区域设置。 要使用 C++ 运行时库更改区域设置,请使用 locale Class。通过调用 locale::global 方法,可以更改未显式启用每线程区域设置的每个线程中的区域设置。要更改应用程序的单个线程或部分的区域设置,只需在该线程或代码部分中创建 locale 对象的实例。 说明: 以下示例显示如何使用 setlocale 函数、locale Class 和 _configthreadlocale 函数在几个不同的方案中更改应用程序的区域设置。 示例 由于线程 A 启用了每线程区域设置,只有线程 A 中的 C 运行时库函数开始使用“法国”区域设置。线程 B 以及主线程中的 C 运行时库函数继续使用“C”区域设置。此外,由于 setlocale 并不影响标准 C++ 库区域设置,所有标准 C++ 库对象继续使用“C”区域设置。
|
-- 作者:卷积内核 -- 发布时间:8/11/2008 8:21:00 AM -- // multithread_locale_1.cpp // compile with: /EHsc /MD #include <clocale> #include <cstdio> #include <locale> #include <process.h> #include <windows.h> #define NUM_THREADS 2 unsigned __stdcall RunThreadA(void *params); BOOL localeSet = FALSE; int main() unsigned aID; unsigned bID; WaitForMultipleObjects(2, threads, TRUE, INFINITE); printf_s("[Thread main] Per-thread locale is NOT enabled.\n"); CloseHandle(threads[0]); return 0; unsigned __stdcall RunThreadA(void *params) WaitForSingleObject(printMutex, INFINITE); return 1; unsigned __stdcall RunThreadB(void *params) WaitForSingleObject(printMutex, INFINITE); return 1; [Thread B] Per-thread locale is NOT enabled. [Thread main] Per-thread locale is NOT enabled. 由于线程 A 启用了每线程区域设置,只有线程 A 中的 C 运行时库函数开始使用“法国”区域设置。线程 B 以及主线程中的 C 运行时库函数继续使用“C”区域设置。但是,由于 locale::global 方法会“全局性地”更改区域设置,所有线程中的所有标准 C++ 库对象都开始使用“法国”区域设置。 复制代码 #define NUM_THREADS 2 unsigned __stdcall RunThreadA(void *params); BOOL localeSet = FALSE; int main() unsigned aID; unsigned bID; WaitForMultipleObjects(2, threads, TRUE, INFINITE); printf_s("[Thread main] Per-thread locale is NOT enabled.\n"); CloseHandle(threads[0]); return 0; unsigned __stdcall RunThreadA(void *params) WaitForSingleObject(printMutex, INFINITE); return 1; unsigned __stdcall RunThreadB(void *params) WaitForSingleObject(printMutex, INFINITE); return 1; [Thread B] Per-thread locale is NOT enabled. [Thread main] Per-thread locale is NOT enabled.
|
-- 作者:卷积内核 -- 发布时间:8/11/2008 8:21:00 AM -- 由于线程 B 没有启用每线程区域设置,线程 B 以及主线程中的 C 运行时库函数开始使用“法国”区域设置。由于线程 A 启用了每线程区域设置,线程 A 中的 C 运行时库函数继续使用“C”区域设置。此外,由于 setlocale 并不影响标准 C++ 库区域设置,所有标准 C++ 库对象继续使用“C”区域设置。 复制代码 #define NUM_THREADS 2 unsigned __stdcall RunThreadA(void *params); BOOL localeSet = FALSE; int main() unsigned aID; unsigned bID; WaitForMultipleObjects(2, threads, TRUE, INFINITE); printf_s("[Thread main] Per-thread locale is NOT enabled.\n"); CloseHandle(threads[0]); return 0; unsigned __stdcall RunThreadA(void *params) WaitForSingleObject(printMutex, INFINITE); return 1; unsigned __stdcall RunThreadB(void *params) WaitForSingleObject(printMutex, INFINITE); return 1; [Thread A] Per-thread locale is enabled. [Thread main] Per-thread locale is NOT enabled. 由于线程 B 没有启用每线程区域设置,线程 B 以及主线程中的 C 运行时库函数开始使用“法国”区域设置。由于线程 A 启用了每线程区域设置,线程 A 中的 C 运行时库函数继续使用“C”区域设置。但是,由于 locale::global 方法会“全局性地”更改区域设置,所有线程中的所有标准 C++ 库对象都开始使用“法国”区域设置。 复制代码 #define NUM_THREADS 2 unsigned __stdcall RunThreadA(void *params); BOOL localeSet = FALSE; int main() unsigned aID; unsigned bID; WaitForMultipleObjects(2, threads, TRUE, INFINITE); printf_s("[Thread main] Per-thread locale is NOT enabled.\n"); CloseHandle(threads[0]); return 0; unsigned __stdcall RunThreadA(void *params) WaitForSingleObject(printMutex, INFINITE); return 1; unsigned __stdcall RunThreadB(void *params) WaitForSingleObject(printMutex, INFINITE); return 1; [Thread A] Per-thread locale is enabled. [Thread main] Per-thread locale is NOT enabled. |
W 3 C h i n a ( since 2003 ) 旗 下 站 点 苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》 |
66.406ms |