linux TLS 线程本地变量
最近在写底层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;
};
}
- 首先pthread_key_create()方法会创建一个关联, 键值为key, java里面线程中使用threadlocal作为key, 数据作为value,存放在ThreadLocalMap中, 嘛,这里就不介绍java的了。 主要是在进层空间的一个数组中添加记录。
- 然后pthread_key_delete()这个方法就是删除由create方法在进程空间的数组中的记录了,一般linux一个进程的key的数量是有限制的, 所以不用了就删除掉,如果线程本地变量比较多,可以考虑将这些封装到一个数据结构里,用一个key映射。
- pthread_getspecific()方法主要是获取当前线程与key关联的数据了, 这里也有可能返回的是NULL(可能是我们释放掉了,赋值为null了)
- pthread_setspecific()方法主要是设置key关联的数据了
具体的说明可以看这篇博客, 写的很不错 http://blog.csdn.net/cywosp/article/details/26469435
linux TLS 线程本地变量的更多相关文章
- Atitit usrqbg1821 Tls 线程本地存储(ThreadLocal Storage 规范标准化草案解决方案ThreadStatic
Atitit usrqbg1821 Tls 线程本地存储(ThreadLocal Storage 规范标准化草案解决方案ThreadStatic 1.1. ThreadLocal 设计模式1 1.2. ...
- .Net - 线程本地变量(存储)的使用
关于C#多线程的文章,大部分都在讨论线程的开始与停止或者是多线程同步问题.多线程同步就是在不同线程中访问同一个变量或共享资源,众所周知在不使用线程同步的机制下,由于竞争的存在会使某些线程产生脏读或者是 ...
- 线程本地变量ThreadLocal源码解读
一.ThreadLocal基础知识 原始线程现状: 按照传统经验,如果某个对象是非线程安全的,在多线程环境下,对对象的访问必须采用synchronized进行线程同步.但是Spring中的各种模板 ...
- 线程本地变量ThreadLocal (耗时工具)
线程本地变量类 package king; import java.util.ArrayList; import java.util.List; import java.util.Map; impor ...
- 线程本地变量ThreadLocal
一.本地线程变量使用场景 并发应用的一个关键地方就是共享数据.如果你创建一个类对象,实现Runnable接口,然后多个Thread对象使用同样的Runnable对象,全部的线程都共享同样的属性.这意味 ...
- .Net学习难点讨论系列17 - 线程本地变量的使用
*:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...
- ThreadLocal 线程本地变量 及 源码分析
■ ThreadLocal 定义 ThreadLocal通过为每个线程提供一个独立的变量副本解决了变量并发访问的冲突问题 当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量 ...
- 线程本地变量ThreadLocal (耗时工具)【原】
线程本地变量类 package king; import java.util.ArrayList; import java.util.List; import java.util.Map; impor ...
- java线程本地变量
ThreadLocal是什么呢?其实ThreadLocal并非是一个线程的本地实现版本,它并不是一个Thread,而是threadlocalvariable(线程局部变量).也许把它命名为Thre ...
随机推荐
- rabbitMQ学习(六)
请求模式 客户端: import com.rabbitmq.client.ConnectionFactory; import com.rabbitmq.client.Connection; impor ...
- 读取excel数据,并进行统计输出
package cn.cnnic.ops; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFou ...
- .net MVC 中枚举类型Enum 转化成 下拉列表的数据源
第一次写技术博文,记录下工作中遇到的问题,给自己的知识做个备份,也希望能帮助到其他的同学 最近接手了公司的一个新的项目.有个页面涉及相关设计. 分享一个经常用到的吧. 方法一: 直入主题吧 我们的目的 ...
- JMS介绍【转载】
什么是JMS JMS(Java Message Service) 即Java消息服务.它提供标准的产生.发送.接收消息的接口简化企业 应用的开发.它是J2EE规范的一部分,定义的接口标准,针对不同的厂 ...
- Dictionary和Hashtable的一些异同
Dictionary和Hashtable 区别: Dictionary和Hashtable 区别 Dictionary Hashtable 支持范型 不支持 需要自己做线程同步 通过调用 Synch ...
- MFC CEdit改变字体大小的方法
方法很多,这里讲解两种比较简单的方法,也是从google上搜索来的. 方法一: CWnd* pEdit; pEdit = GetDlgItem(IDC_EDIT_ONE); ASSERT(pEdit ...
- 发邮件 和 excel导出中文文件名
/** * 发邮件 * @param email * @param subject * @param body * @throws UnsupportedEncodingException */ pu ...
- windows 下 gvim打开默认全屏显示
在_vimrc文件中加入如下配置即可: autocmd GUIEnter * simalt ~x
- Js 职责链模式 简单理解
js 职责链模式 的简单理解.大叔的代码太高深了,不好理解. function Handler(s) { this.successor = s || null; this.handle = funct ...
- bash:fdisk:command not found
bash:fdisk:command not found [lansir@Red-Hat ~]$ fdisk -l-bash: fdisk: command not found 原因是fdisk不在P ...