最近在写底层hook的时候, 涉及到线程安全问题, 最开始我设计的时候使用的互斥量, 但是考虑到都是底层函数,加锁会导致性能问题, 一直在思考优化方案, 后来偶然想到,java里面有线程本地变量的API, 或许linux也有, 问过度娘后发现还真有对应的API, 而且c++11的标准库里面也有实现, 不过我这暂时用不了c++11了, 就考虑封装一个, 下面是我的封装后的代码:

  template <typename T>
class ThreadLocal
{
public :
explicit ThreadLocal()
{
pthread_key_create(&key, destory<T>);
} ~ThreadLocal()
{
pthread_key_delete(key);
} void set(T* value)
{
if (value != NULL)
{
void * old = pthread_getspecific(key);
if (old != NULL)
{
delete old;
}
pthread_setspecific(key, value);
}
} void remove()
{
void *old = pthread_getspecific(key);
if (old != NULL)
{
delete old;
}
pthread_setspecific(key, NULL);
} T* get()
{
void * value = pthread_getspecific(key);
if (value == NULL)
{
value = init();
pthread_setspecific(key, value);
} return (T *)value;
}

     template<typename U>
static void destory(void * value)
{
if (value != NULL)
{
U * v = (U *)value;
delete v;
}
} protected:
T * init()
{
T *ret = new T ();
return ret;
}
private:
pthread_key_t key;
};
}
  1. 首先pthread_key_create()方法会创建一个关联, 键值为key,  java里面线程中使用threadlocal作为key, 数据作为value,存放在ThreadLocalMap中, 嘛,这里就不介绍java的了。 主要是在进层空间的一个数组中添加记录。
  2. 然后pthread_key_delete()这个方法就是删除由create方法在进程空间的数组中的记录了,一般linux一个进程的key的数量是有限制的, 所以不用了就删除掉,如果线程本地变量比较多,可以考虑将这些封装到一个数据结构里,用一个key映射。
  3. pthread_getspecific()方法主要是获取当前线程与key关联的数据了, 这里也有可能返回的是NULL(可能是我们释放掉了,赋值为null了)
  4. pthread_setspecific()方法主要是设置key关联的数据了

具体的说明可以看这篇博客, 写的很不错 http://blog.csdn.net/cywosp/article/details/26469435

linux TLS 线程本地变量的更多相关文章

  1. Atitit usrqbg1821 Tls 线程本地存储(ThreadLocal Storage 规范标准化草案解决方案ThreadStatic

    Atitit usrqbg1821 Tls 线程本地存储(ThreadLocal Storage 规范标准化草案解决方案ThreadStatic 1.1. ThreadLocal 设计模式1 1.2. ...

  2. .Net - 线程本地变量(存储)的使用

    关于C#多线程的文章,大部分都在讨论线程的开始与停止或者是多线程同步问题.多线程同步就是在不同线程中访问同一个变量或共享资源,众所周知在不使用线程同步的机制下,由于竞争的存在会使某些线程产生脏读或者是 ...

  3. 线程本地变量ThreadLocal源码解读

      一.ThreadLocal基础知识 原始线程现状: 按照传统经验,如果某个对象是非线程安全的,在多线程环境下,对对象的访问必须采用synchronized进行线程同步.但是Spring中的各种模板 ...

  4. 线程本地变量ThreadLocal (耗时工具)

    线程本地变量类 package king; import java.util.ArrayList; import java.util.List; import java.util.Map; impor ...

  5. 线程本地变量ThreadLocal

    一.本地线程变量使用场景 并发应用的一个关键地方就是共享数据.如果你创建一个类对象,实现Runnable接口,然后多个Thread对象使用同样的Runnable对象,全部的线程都共享同样的属性.这意味 ...

  6. .Net学习难点讨论系列17 - 线程本地变量的使用

    *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...

  7. ThreadLocal 线程本地变量 及 源码分析

    ■ ThreadLocal 定义 ThreadLocal通过为每个线程提供一个独立的变量副本解决了变量并发访问的冲突问题 当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量 ...

  8. 线程本地变量ThreadLocal (耗时工具)【原】

    线程本地变量类 package king; import java.util.ArrayList; import java.util.List; import java.util.Map; impor ...

  9. java线程本地变量

      ThreadLocal是什么呢?其实ThreadLocal并非是一个线程的本地实现版本,它并不是一个Thread,而是threadlocalvariable(线程局部变量).也许把它命名为Thre ...

随机推荐

  1. 转 LoadRunner 技巧之THML 与 URL两种录制模式分析

    Loadrunner的Virtual User Generator 提供人脚本的录制功能,对于初学者来说,这大大的降低了编写脚本的门槛,loadrunner提供两种录制脚本的方式:Html_based ...

  2. 封装、调用ajax

    1.JavaScript代码 //封装ajaxfunction ajax(obj) { var xhr = new createXHR(); obj.url = obj.url + '?rand=' ...

  3. findViewById返回null

    Q:findViewById返回null? A: 代码逻辑错误: 最终,发现错误竟然是在layout文件中把android:id写成了android:name. android:name=" ...

  4. JQuery实现的模块交换动画效果

    <!doctype html> <html> <head> <meta http-equiv="content-type" content ...

  5. js判断input输入框长度(支持中英文输入)

    function CheckTxtLength(txt) { var num = txt.replace(/[^\x00-\xff]/g, 'xx').length; if (num <=11) ...

  6. linux 驱动学习笔记05--文件系统与设备文件系统

    查看/proc/devices 文件可以获知系统中注册的设备,第 1 列为主设备号,第 2 列为设备名,如:

  7. web初学之request,session与application

    request (1)request的setAttribute()与getAttribute()方法一般都是成对出现,首先通过setAttribute()方法设置属性与属性值,然后通过getAttri ...

  8. table 细边框

    table { border-collapse: collapse; border: none; width: 200px; } td { border: solid #000 1px; }

  9. SQL Server执行计划的理解

    详细看:http://www.cnblogs.com/kissdodog/p/3160560.html 自己总结: 扫描Scan:逐行遍历数据. 查找Seek:根据查询条件,定位到索引的局部位置,然后 ...

  10. 开始学java痛苦之旅开启 12-31日 第一章节笔记

    1.JDK,Java development kit,开发环境(JDK)2.JRE 是Java运行环境 (Java Runtime Enviroment) 的缩写 我的电脑--属性--工具--文件夹选 ...