【发布时间】: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_create和pthread_setspecific实现这一点。请注意他们如何按照@Someprogrammerdude 的建议提供此功能。malloc做了类似的事情,因为每个线程都有自己的内存池存储在它们的 TLS 中。 -
是的,你是对的。我只是认为thread_local可以通过将相同的虚拟地址映射到不同pthread的不同物理地址来实现,但我发现
pthread_create使用CLONE_VM阻塞这种方式。而且我还发现this paper 告诉thread_localgetter 确实处理了一些特殊代码而不是正常访问。无论如何,我将使用包装器。谢谢。
标签: c++ include thread-local