gpt4 book ai didi

c - 为什么 glibc(可能还有其他)static tm struct 不是本地线程?

转载 作者:太空宇宙 更新时间:2023-11-03 23:25:22 25 4
gpt4 key购买 nike

今天进行同行评审时,有人以 tm tm = *gmtime(&t) 的形式提示 gmtime 的使用。我的假设一直是它会使用每线程存储来确保安全,但环顾四周似乎 time/localtime.c 只是将其声明为常规全局。

https://sourceware.org/git/?p=glibc.git;a=blob;f=time/localtime.c;h=38f3123d9a4093c3bbd78e4d39f63491af1fed56;hb=master

/* The C Standard says that localtime and gmtime return the same pointer.  */
struct tm _tmbuf;

如果我理解正确的话,这会使该实现在现代系统上完全崩溃,因为可靠地告诉其他线程在做什么是不切实际的?

为什么它不是按线程制作的,以使其尽可能安全?

我当然知道这个函数还有其他版本(虽然不可移植),所以一个简单的 mygmtime 包装器是可能的,但看起来很奇怪这仍然是一个突出的问题。

最佳答案

gmtime()localtime() 函数不是线程安全的,这是正确的。 C 库中有不少这样的函数,它们之所以如此,是因为它们是为单线程程序设计的(曾经是唯一一种),将它们更改为依赖线程本地数据将是一种改动到他们先前定义的语义。它们并没有“完全损坏”,因为许多程序只使用一个线程,而且如果小心使用,它们也可以用于多线程程序。

话虽如此,这些是可重入版本已标准化的众多功能之一(gmtime_r()localtime_r());如果可重入版本可供您使用,那么它们是多线程程序的更好选择。

关于c - 为什么 glibc(可能还有其他)static tm struct 不是本地线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28460236/

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