2

我有一个我目前正在用 C 编写的应用程序,其中我在作为项目一部分的库中声明了几个 TLS 静态全局变量。

TLS 变量是使用 gcc 的 __thread 指令声明的。

我想知道我是否可以使用 .ctor && .dtor 部分在共享或静态 C 库中基于每个线程初始化 TLS 数据,以及使用此方法的线程安全性如何。

.ctor && .dtor 部分是按线程执行还是仅存在于父进程中?

最后一点,库静态或动态编译为应用程序代码,这是否意味着共享/静态库中贴花的 .ctor && .dotr 部分将成为最终可执行文件的一部分?

我真的对线程部分感到困惑,主要是......有谁有想法吗?

4

3 回答 3

1

尝试一下,看看会发生什么,但最好不要依赖手册中未定义的行为——它可能会在没有通知的情况下更改。

据我所知,__attribute__((constructor))仅适用于在加载时运行的全局数据。尝试将其与 TLS 混合可能是未定义的,或者可能仅初始化主线程的数据。

于 2013-01-14T10:07:33.360 回答
1

pthread_key_create 使用析构函数回调创建 tls 条目;

示例用法在这里: http: //linux.die.net/man/3/pthread_key_create

但是,您必须在线程中设置 tls 变量,否则不会调用析构函数回调。

于 2013-12-05T03:49:12.833 回答
0

不,没有可以在启动线程时激活的回调。我认为这将是一个性能杀手:任何天真的程序员都可能意外添加这样的回调,并且突然之间程序的每个线程,即使是那些不访问该 TLS 的线程也会变慢。

对于 gcc__thread以及相应的 C11 功能,_Thread_local只能预见到静态初始化。对于必须在编译时确定的每个副本,这是相同的值。

于 2013-01-14T10:27:20.747 回答