【发布时间】:2017-07-26 11:22:16
【问题描述】:
在 (g)libc 中,例如在 localtime 等时间和日期函数中,手册说:
返回值指向一个静态分配的字符串,它可能 被后续调用任何日期和时间覆盖 功能。
据我所知,我的程序是单线程的。我使用 asctime 或 localtime 等“MT-Unsafe”功能是否安全?
即使内存中只有 1 个 (g)libc 库实例? (即作为动态库。)
“静态”是指“我的程序是静态的”(为每个程序实例分配一个新的缓冲区实例......)、“进程的静态”(每个进程一个缓冲区实例 --this suggests)还是静态的到 (libc) 库(与库 (-fragment) 实例一样多的缓冲区实例)?
(我知道问题 #8694365,但我的有点不同。)
【问题讨论】:
-
没有“库实例”之类的东西。如果 C 标准说你可以使用
localtime,并且你的程序遵循标准(即不使用线程之类的东西),那么你可以使用localtime。这就是标准的用途。 -
怎么强调都不过分:没有“库实例”之类的东西。
-
@R - 这取决于编译器。 gnu 有一个本地时间的线程不安全版本,而Visual Studio local time 似乎总是线程安全的。 DLL 库可以被视为“每个系统一个实例”库。静态库可以被视为“每个进程一个实例”。 Windows 有一个每个线程数据区域,供线程安全库根据需要使用。我不知道 Posix 系统是如何实现这一点的。
-
@R..:进程中只能有一个共享对象文件的实例,但没有什么能阻止我从两个不同的库加载同一个库(或具有相同外部定义的库)文件。或者来自静态链接和动态链接“相同”库。在这两种情况下,都会观察到静态分配的对象属于库对象而不是整个进程,这通常会导致悲伤。
-
@rici:在这种情况下,您的程序有 UB(重复定义),发生的事情超出了 C 语言的范围。
标签: c libc localtime single-threaded static-allocation