首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

线程局部存储TLS C语言兑现

2013-01-28 
线程局部存储TLS C语言实现各位好:在window下有线程局部存储这么一个概念,相应的函数TLSAlloc()、TlsSetVal

线程局部存储TLS C语言实现
各位好:
    在window下有线程局部存储这么一个概念,相应的函数TLSAlloc()、TlsSetValue()、TlsGetValue()、TlsFree()。现在问题是我要在另外一个嵌入式平台实现它,看到网上说最简单的办法就是建立一个全局表,通过当前线程ID去查询相应的数据,因为各个线程的ID不同,查到的数据自然也不同了。但我不太理解,所以来请教一下。
    是建立一个2维数组存放不同数据,然后通过某个ID去查询吗?
谢谢
[解决办法]
用二维数组模拟的话,每行就代表不同TLS数据的槽位,一行分配给一个线程,线程能分配使用的最大槽位数是固定的,清空所有数据,保证每个线程第一次访问每个槽位的数据返回NULL就行

其实windows的TLS也差不多是这样的,只不过windows的TLS除了基本的64的TLS数据外还可以在heap中动态增加1024个,用到了些lazy initialization来优化性能,其他的就是windows对tls访问做了些优化设计,将tls链的地址保存在teb中通过fs能轻松的访问而不用查表
[解决办法]

引用:
用二维数组模拟的话,每行就代表不同TLS数据的槽位,一行分配给一个线程,线程能分配使用的最大槽位数是固定的,清空所有数据,保证每个线程第一次访问每个槽位的数据返回NULL就行

其实windows的TLS也差不多是这样的,只不过windows的TLS除了基本的64的TLS数据外还可以在heap中动态增加1024个,用到了些lazy initialization来优化性……


是,Linux也是这样的,猜测很多Unix也是这样做的
印象中是一个512*512的固定数组,里面存放的是指针,Linux的接口没有Windows的复杂,只有一个初始化、释放还是Set和Get操作
[解决办法]
linux 下用
int pthread_key_create(pthread_key_t *key, void (*destructor)(void*));
void *pthread_getspecific(pthread_key_t key);
int pthread_setspecific(pthread_key_t key, const void *value);

[解决办法]
//比如10个线程的ThreadID分别为412,413,414,415,416,417,418,419,420,421
static char BufOfThread[10][100];
memset(BufOfThread[ThreadID%10],0,100);

热点排行