最近在写底层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. 解析JSON字符串

    import java.util.ArrayList; import java.util.List; import org.json.JSONArray; import org.json.JSONOb ...

  2. Productivity Power Tools 动画演示(转)

    Productivity Power Tools 是微软官方推出的 Visual Studio 扩展,被用以提高开发人员生产率.它的出现一定程度上弥补和完善了 Visual Studio 自身的不足, ...

  3. java工程或web工程项目上出现红色感叹号

    最近在新公司重新搭建mybatis3+spring4框架的时候出现的问题.确定这个问题是出现在项目的build path里面,但是如果jar包上没出现红X就不知道哪个jar包有问题了,最笨的办法是删除 ...

  4. windows svn 配置以及iis同步传送

    服务端:http://www.visualsvn.com/server/download/ 客户端:  http://tortoisesvn.net/downloads.html 建立版本之后,在版本 ...

  5. Avalon接口协议

    Avalon接口协议 https://www.altera.com/content/dam/altera-www/global/en_US/pdfs/literature/manual/mnl_ava ...

  6. leetcode 6. ZigZag Conversion

    https://leetcode.com/problems/zigzag-conversion/ 题目: 将字符串转化成zigzag模式. 例如 "abcdefghijkmlnpq" ...

  7. ArcEngine读取数据(数据访问) (转)

    读取和访问数据是进行任何复杂的空间分析及空间可视化表达的前提,ArcGIS支持的数据格式比较丰富,下面就这些格式Shapefile.Coverage.Personal Geodatabase.Ente ...

  8. 安装ANDROID5.0 ,adb连接不上

    一.ADB PC端需要换成5.0 的版本 二.是4.3默认端口5555,但是现在没有连接上.即绑定端口. setprop service.adb.tcp.port 5555 stop adbd sta ...

  9. 打水印 Imagename_biao是水印文件 ImgName是原图

    /** * 打水印 Imagename_biao是水印文件 ImgName是原图 * @param Imagename_biao * @param ImgName */ public static v ...

  10. Maven Archetype

    1. 从project创建archetype 在项目根目录下,运行 mvn archetype:create-from-project 创建的archetype工程在app_folder/target ...