gpt4 book ai didi

c - 为什么 POSIX 将 wctomb 指定为非线程安全的,而不是 mbtowc?

转载 作者:太空狗 更新时间:2023-10-29 16:31:15 25 4
gpt4 key购买 nike

在 XSH 2.9.1 , wctomb 被列为不需要线程安全的函数之一。但是,相反的转换函数 mbtowc 没有出现在列表中。在使用移位状态的编码的实现中,两者都没有线程安全的 API,并且要求一个是线程安全的而另一个不是是没有意义的,而如果不禁止状态编码,两者都不是线程安全的。

wcstombs(在列表中)和 mbstowcs(不在列表中)也是如此。由于这两个函数都对以初始移位状态开始和结束的整个字符串进行操作,因此它们不是有状态的,它们的 API 是线程安全的,同样,指定一个方向是线程安全的而不是指定方向是线程安全的也是没有意义的其他。

任何人都可以阐明这一点吗?

最佳答案

正如您在问题中指出的那样,wctomb 具有或至少被允许具有(隐藏的)“转换状态”:参见 http://pubs.opengroup.org/onlinepubs/009695399/functions/wctomb.html并将其与 wcrtomb 进行比较:http://pubs.opengroup.org/onlinepubs/009695399/functions/wcrtomb.html它有一个明确的“状态”指针。

POSIX 基本上允许程序员将 wctomb 实现为对 wcrtomb 的调用,使用 static 变量来保存移位状态。如果该变量不是每线程项目,它将不是线程安全的。

(所有这些都非常明显并且包含在您的问题中,为了清楚起见,我只是在这里重复它)

请注意,wctomb 没有任何参数可以让您对隐藏的移位状态(如果有的话)进行任何形式的显式控制。具体来说,您不能将其重置为开始状态。

但是现在看看mbtowc:http://pubs.opengroup.org/onlinepubs/009695399/functions/mbtowc.html文字说:

For a state-dependent encoding, this function is placed into its initial state by a call for which its character pointer argument, s, is a null pointer. Subsequent calls with s as other than a null pointer shall cause the internal state of the function to be altered as necessary. A call with s as a null pointer shall cause this function to return a non-zero value if encodings have state dependency, and 0 otherwise. If the implementation employs special bytes to change the shift state, these bytes shall not produce separate wide-character codes, but shall be grouped with an adjacent character.

也就是说,它们为您提供了一种检测和控制隐藏状态(如果存在)的显式方法。因此,即使它存在并且不是特定于线程的,您也可以照原样“进行自己的控制”。

虽然我不能发誓,但我认为这就是为什么 mbtowc 没有被列为非线程安全的原因。

(不过,这不是我在标准中编写文本的方式!话又说回来,如果我按照自己的方式行事,很多这些功能甚至都不存在。:-))

关于c - 为什么 POSIX 将 wctomb 指定为非线程安全的,而不是 mbtowc?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4785300/

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