我有一个我正在用C编写的应用程序,我在库中声明了几个TLS静态全局变量,这是项目的一部分。
使用gcc的__thread指令声明TLS变量。
我想知道我是否可以使用.ctor&& .dtor部分在共享或静态C库中基于每个线程初始化TLS数据,以及使用此方法的线程安全性。
.ctor&&每个线程执行.dtor部分,或者它们只存在于父进程中?
最后一点,图书馆静态或动态地编译应用程序代码,这是否意味着.ctor&&共享/静态库中的.dotr部分decalred将成为最终可执行文件的一部分吗?
我对线程部分感到很困惑,主要是......有想法的人?
答案 0 :(得分:1)
尝试一下,看看会发生什么,但最好不要依赖手册中未找到的行为 - 它可能会在没有通知的情况下发生变化。
据我所知,__attribute__((constructor))
仅适用于在加载时运行的全局数据。尝试将其与TLS混合可能是未定义的,或者可能只初始化主线程的数据。
答案 1 :(得分:1)
pthread_key_create使用析构函数回调创建tls条目;
示例用法在此处:http://linux.die.net/man/3/pthread_key_create
但是你必须在一个线程中设置tls变量,否则不会调用析构函数回调。
答案 2 :(得分:0)
不,没有回调你可以在启动线程时激活。我认为这将是一个性能杀手:任何天真的程序员都可以偶然添加这样的回调以及所有突然程序的每个线程,即使那些不访问TLS的人也会放慢速度
对于gcc的__thread
以及相应的C11功能_Thread_local
,预计只会进行静态初始化。对于每个必须在编译时确定的副本,使用相同的值。