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语句...
动态的自不必说,单表那静态的:
对于栈内的临时变量当然不存在线程局部问题(他本来就是线程局部的)。而全局变量是对所有
线程可见的.并且所有的线程存取的都是同内存一位置,为了使某个全局变量局部于线程,则可
声明如下:__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语句...
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货