【问题标题】:C++ export thread_local global variable in C?C++ 在 C 中导出 thread_local 全局变量?
【发布时间】:2018-12-06 00:07:23
【问题描述】:

我正在使用 C++ 开发一个共享库,并希望用户包含一个 C 标头。

该库导出一个thread_local 全局变量,因此应在标头中写入extern 指令。

并且这个变量只能在库代码(C++)中修改,在用户代码(C语言)中是只读的。

但是 C 语言没有 thread_local 关键字。 那么,有什么想法吗?

简单的extern type variable 绝对正确吗?

在 C 中修改变量的情况呢?一切仍然有效吗?

【问题讨论】:

  • 不要“导出”全局变量,而是使用函数来获取变量的当前值?
  • @Someprogrammerdude 当然可以。但我只是对这种情况感兴趣。
  • 可能关键问题是thread_local变量如何存储和访问,就像普通变量一样,但是在一个特殊的映射地址空间中?还是什么魔法?
  • 如果只使用extern,那么整个库中只有一个变量,而在使用线程本地存储的情况下,编译器会在线程本地内存中分配空间来保留并初始化变量。在 C 语言中,您可以通过 pthread_key_createpthread_setspecific 实现这一点。请注意他们如何按照@Someprogrammerdude 的建议提供此功能。 malloc 做了类似的事情,因为每个线程都有自己的内存池存储在它们的 TLS 中。
  • 是的,你是对的。我只是认为thread_local可以通过将相同的虚拟地址映射到不同pthread的不同物理地址来实现,但我发现pthread_create使用CLONE_VM阻塞这种方式。而且我还发现this paper 告诉thread_local getter 确实处理了一些特殊代码而不是正常访问。无论如何,我将使用包装器。谢谢。

标签: c++ include thread-local


【解决方案1】:

我想变量是相对于存储在线程上下文中的指针引用的。甚至可能是一个寄存器。创建线程时,分配数据并初始化指针以指向它。 (上下文总是需要空间。)当进程从一个线程切换到另一个线程时,当前上下文被存储一个不同的上下文恢复,包括间接指针。如果您不使用正确的类型,则链接时的修补将不正确,并且不会使用正确的内存区域。我不知道补丁是否只是错误的,或者链接器是否知道符号类型,给 ether 一个显式错误或只是将全局视为未定义。即我不知道它是否将其视为不同的符号、相同的符号但声明有冲突的类型或相同的符号,但混合的引用方法是否会破坏代码。

【讨论】:

    猜你喜欢
    • 2020-01-23
    • 2013-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-01
    • 2015-06-12
    • 2014-12-20
    相关资源
    最近更新 更多