gpt4 book ai didi

关于返回静态缓冲区指针的函数的 C11 线程安全

转载 作者:太空狗 更新时间:2023-10-29 17:10:13 24 4
gpt4 key购买 nike

考虑像 C 标准库中的 localtime 这样的函数,它返回一个指向(历史上)静态缓冲区的指针。 C11 是否使这些缓冲区成为线程本地缓冲区?

根据 C11 中的 7.1.4:

Unless explicitly stated otherwise in the detailed descriptions that follow, library functions shall prevent data races as follows: A library function shall not directly or indirectly access objects accessible by threads other than the current thread unless the objects are accessed directly or indirectly via the function's arguments. A library function shall not directly or indirectly modify objects accessible by threads other than the current thread unless the objects are accessed directly or indirectly via the function's non-const arguments. Implementations may share their own internal objects between threads if the objects are not visible to users and are protected against data races.

考虑例如 localtime。它的返回值指向的 struct tm 似乎不符合“内部对象”的条件,因为调用者可以访问它,因此似乎 localtime 的调用在另一个线程可能不会破坏先前在第一个线程中返回的结果。这意味着 localtime 需要为每个线程使用不同的缓冲区。

但是,标准没有指定返回其地址的对象的生命周期的结束,而且我认为在调用线程终止后继续使用此 struct tm 的程序没有理由是无效的。因此,对象不能有线程存储持续时间。

我发现一个实现可以满足所有要求的唯一方法是到处泄漏内存,这肯定不是我们想要的。我是否遗漏了一些明显的东西,或者 C11 对遗留接口(interface)的线程安全处理是否真的考虑不周?

最佳答案

... 除非另有明确说明:7.27.3 时间转换函数 的介绍章节明确指出这些函数不应该避免数据竞争。 (许多其他库函数也是如此。)

规范性附件K中的边界检查扩展中有带有_s后缀的派生函数,旨在避免竞争条件。

关于关于返回静态缓冲区指针的函数的 C11 线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9138666/

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