【问题标题】:What does "statically allocated" exactly mean in libc? One per library instance? One per program instance?libc 中的“静态分配”到底是什么意思?每个库实例一个?每个程序实例一个?
【发布时间】:2017-07-26 11:22:16
【问题描述】:

在 (g)libc 中,例如在 localtime 等时间和日期函数中,手册说:

返回值指向一个静态分配的字符串,它可能 被后续调用任何日期和时间覆盖 功能。

据我所知,我的程序是单线程的。我使用 asctimelocaltime 等“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


【解决方案1】:

全局(在函数外部定义)和静态(在函数内部定义)为每个程序分配一次。否则,asctime 将完全无法使用,因为您无法确定没有其他程序同时调用该确切函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多