【发布时间】:2019-11-19 20:42:25
【问题描述】:
这个问题与我目前想做的事情无关,但我在阅读 sprintf() printf() 和 setlocale() 的 (GNU/Linux/ISO-C) 文档时想知道的事情。
假设问题:
想象一个多线程应用程序,它使用 printf/scanf 系列在一个线程上进行用户面对的文本输出,并在 上使用 printf/scanf 进行文件甚至网络 I/O >另一个线程。现在想象一个场景,该应用程序需要为不同类型的 I/O 使用不同的编码/语言环境。
设置语言环境/编码的方法是使用setlocale(),它在Linux Programmer's Manual 中明确标记为“MT-Unsafe”。
ISO/IEC 9899:2018 在 7.11.1.1 中有以下内容
对 setlocale 函数的调用可能会与对 setlocale 的其他调用引入数据竞争 函数或调用受当前语言环境影响的函数。实施应 表现得好像没有库函数调用 setlocale 函数。
据我所知,这使得标准 C 没有标准方法来处理前面描述的情况。 (这不涉及线程之间不必要的同步,否则不会干扰)
请注意,POSIX 指定了专门为此而设计的 uselocale() 函数。
但这不是嵌入式或多平台代码的解决方案。
问题:
- 是否有一种可移植且不繁琐的方式来处理此类情况,而无需借助自定义库
- 如果不是这样:从标准中省略此类功能的原因可能是什么
TL;DR: 如何处理多线程编码(POSIX 之外)?
【问题讨论】:
标签: c multithreading encoding printf locale