ld_preload和线程本地变量
LD_PRELOAD and thread local variable
我有一个共享库(libtest.cpp)和一个简单的程序(test.cpp)。我希望他们共享线程本地变量 gvar 。共享库通过ld_preload链接。
这是我共享库libtest.cpp的代码:
#include<stdio.h>
__thread int gVar;
void print_gVar(){
printf("%dn", gVar);
}
以下是test.cpp的代码
#include<stdio.h>
__thread int gVar;
void __attribute__((weak)) print_gVar();
int main(){
gVar = 10;
print_gVar();
return 0;
}
我使用以下脚本来编译和运行它们。
g++ -g -shared -fPIC -olibtest.so libtest.cpp
g++ -g -fPIC -o test test.cpp
LD_PRELOAD=./libtest.so ./test
预期的结果为10,因为test.cpp中的分配会影响libtest.cpp中的gvar。但是,我只得到0。似乎libtest.cpp中的gvar和test.cpp中的gvar中没有链接。
我做了一些其他测试:
如果我将__attribute__((weak))
添加到任何文件中的gVar
声明中,则输出仍然为0。
如果我从两个文件中删除__thread
,则结果为10(成功)。
如果我将 extern
和 __attribute__((weak))
添加到libtest.cpp中的 gVar
声明中,则会有分段故障。
我猜LD_PRELOAD
和__thread
必须有问题。但是我不知道。
有人可以告诉我如何使它起作用吗?非常感谢!
这是不可能的,因为线程 - 本地存储需要人均初始化。
LD_PRELOAD
甚至在加载标准库之前加载库,这使TLS初始化混乱。
更新:
请阅读Elf处理的第2节和第3节以进行线程 - 本地存储
相关文章:
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 类与私有变量的其他类之间的线程安全性
- 全局变量 多读取器 一个写入器多线程安全?
- 静态 constexpr 类成员变量对多线程读取是否安全?
- 成员变量在多线程 C++ 时自行更改
- C++线程安全:如果只有一个线程可以写入非原子变量,但多个线程从中读取. 会遇到问题吗?
- 多个线程可以安全地同时将相同的值写入同一变量吗?
- C++11:具有互斥锁的线程看到原子变量的值发生变化,尽管这是唯一可以改变它的代码
- C++线程不检测全局变量更改
- 为什么 beginthreadex 线程参数变量在父线程中没有更新
- C++多线程程序:变量定义为类成员的隔离错误
- std::线程不是全局变量,但在到达创建它的函数的末尾时不会超出范围?
- 对全局变量的多线程访问:我应该使用互斥锁吗?
- 子线程中的条件变量等待停止主线程中的执行
- 是局部unordered_map变量线程在C 中安全的线程
- 如何使类静态变量线程安全
- 命名空间中的全局变量 - 线程中的值不同
- 静态变量与堆栈变量:线程安全与堆栈大小
- 共享提升::shared_ptr<>变量线程安全吗?
- 在析构函数中pthead_join()类成员变量线程是否明智?