gpt4 book ai didi

使用 sprintf 和 printf 时的 C 线程安全区域设置/编码

转载 作者:行者123 更新时间:2023-12-03 12:43:55 27 4
gpt4 key购买 nike

这个问题与我目前想做的事情无关,而是我在阅读 sprintf() 的(GNU/Linux/ISO-C)文档时想知道的事情printf()setlocale() .

假设问题:

想象一个 多线程 使用 的应用程序printf/scanf 一个线程上面向用户的文本输出系列和 上用于文件甚至网络 I/O 的 printf/scanf另一个话题 .现在想象一个场景,该应用程序需要使用 不同的编码/语言环境 用于不同类型的 I/O。
设置语言环境/编码的方法是使用 setlocale()Linux Programmer's Manual 中明确标记为“MT-Unsafe” .

ISO/IEC 9899:2018 在 7.11.1.1 有以下说法

A call to the setlocale function may introduce a data race with other calls to the setlocale function or with calls to functions that are affected by the current locale. The implementation shall behave as if no library function calls the setlocale function.



在我看来,这使得标准 C 没有标准方法来处理前面描述的情况。 (这不涉及线程之间不必要的同步,否则不会干扰)

请注意,POSIX 指定了 uselocale() 专门为此制作的功能。
但这不是嵌入式或 tuly 多平台代码的解决方案。

问题 :
  • 是否有一种可移植的、不麻烦的方法来处理这些情况,而无需求助于自定义库
  • 如果不是这样:从标准
  • 中忽略此类功能的原因可能是什么?

    特尔;博士:
    如何处理多线程编码(POSIX 之外)?

    最佳答案

    您不能安全地使用 setlocale一旦程序变为多线程,就完全在程序中。如果您需要多个语言环境,则需要 newlocale/uselocale线程本地或一流语言环境对象的 API,而不是 setlocale .

    关于使用 sprintf 和 printf 时的 C 线程安全区域设置/编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58942485/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com