TLS想要解决的问题
- 性能
- 例如从TLS分配内存可以显著提高速度
- 避免或者减少锁的竞争
- 正确性。例如errno的设置
TLS的思想是以空间换时间,对于一个key,TLS为为每个线程保存一个独立的副本。
TLS在实现时,其实可以不依赖语言的关键字,其实TLS就是把一个数据结构跟线程关联起来。在线程初始化的时候,初始化某些资源,在线程退出的时候,清理某些资源。当然这些跟线程相关的资源,是每个线程独享的,因此访问的时候不需要加任何的锁。每个线程在获取内存的时候,可以先从线程本地分配,如果分配不到,再去公共的资源池中获取资源,放到线程本地。
TLS的本质就是挺简单的,看很多文章好像把这个东西复杂化了,一提TLS就好像是在说C++、Java的关键字,仿佛这东西必须由语言关键字支持似的,其实并不是。了解TLS之后,使用C语言也能自己搞一个TLS的库出来。
TLS通常来说,需要配合线程库一起来实现。在创建线程的时候,同时也预分配一部分内存给线程,作为线程独享的内存块。
所以TLS本质上就是线程独享的一块内存。理解了这个本质之后,剩下的就是实现上的细节了。
TLS的最基本的使用,可以查阅一下pthread_key_create、pthread_setspecific、pthread_getspecific、pthread_key_delete这一系列的API来完成TLS的key的创建、设置、获取、删除功能。
网友评论