TLS,线程本地存储的问题

joinjoy 2001-01-04 03:01:00
如果创建了10个线程,它们都是依赖同一个线程函数创制的。那么每个线程都有自己的堆栈,函数的变量放在各自的堆栈里,所以每个线程的变量可以各不相同。
那么,tls还用来干什么呢?它操控的变量是哪一部分的呢?
...全文
102 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
wjf 2001-01-04
  • 打赏
  • 举报
回复
tls有两种,一种是静态的,一种是动态的;
动态的自不必说,单表那静态的:
对于栈内的临时变量当然不存在线程局部问题(他本来就是线程局部的)。而全局变量是对所有
线程可见的.并且所有的线程存取的都是同内存一位置,为了使某个全局变量局部于线程,则可
声明如下:

__declspec( thread ) int tls_i = 1;

那么不同的线程存取的将是不同内存位置的tls_i;
对于如下语句:
int n = tls_i;
反汇编可看到:
...
mov ecx,dword ptr [__tls_index (004237cc)]
mov edx,dword ptr fs:[2Ch]
mov eax,dword ptr [edx+ecx*4]
mov ecx,dword ptr [eax+104h]
mov dword ptr [ebp-2Ch],ecx
...


实际上编译器处理tls_i的存取时使用了__tls_index,而不仅仅是运行几条mov语句...

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧