Thread-local storage (TLS)

线程存储原理:为变量在每一个现存的线程里分配一个实例,需要处理器支持,并不是所有都支持!支持全局的,静态的变量,但不支持局部变量。

关键字

   __thread   __thread int i;

    extern __thread struct state s;

   static __thread char *p;

测试  

   

#include<pthread.h>
#include<unistd.h>
#include<string.h>
#include <stdio.h>

__thread int var=1;

typedef struct context_t
{
  int p1;
  char name[256];
}context;

__thread  context ctx;

void  product(char *name)
{
   static  __thread int i = 0;
   printf("--->%s:%d\n",name, ++i);
}

void* worker1(void*arg);
void* worker2(void*arg);

int main()
{
    pthread_t pid1,pid2;
    memset(&ctx, 0, sizeof(context));
    ctx.p1 = 11;
    strcpy(ctx.name, "null");

    pthread_create(&pid1,NULL,worker1,NULL);
    pthread_create(&pid2,NULL,worker2,NULL);
    pthread_join(pid1,NULL);
    pthread_join(pid2,NULL);

    printf("exit, var:%d, p1:%d, name=%s \n",var,ctx.p1, ctx.name);

    return 0;
}
void* worker1(void* arg){
strcpy(ctx.name, "lilei");
ctx.p1=1;
printf("work1:%d \n", ++var);
printf("work1:%d, name=%s\n", ctx.p1, ctx.name);
product("work1");
}
void* worker2(void* arg){
sleep(5);
printf("work2:%d \n", ++var);
printf("work2:%d, name=%s\n", ctx.p1, ctx.name);
product("work2");
}

输出结果:

[[email protected] test]# gcc -lpthread -o test test.c
[[email protected] test]# ./test
work1:2
work1:1, name=lilei
--->work1:1
work2:2
work2:0, name=
--->work2:1
exit, var:1, p1:11, name=null 

可以看出多个线程调用,但是var,ctx, i变量值显示都是线程独立的。

参考 http://gcc.gnu.org/onlinedocs/gcc-4.4.4/gcc/Thread_002dLocal.html

另一种 TLS 通过pthread_key_create实现 http://www.cnblogs.com/gogly/articles/2416362.html

时间: 2024-10-19 03:45:01

Thread-local storage (TLS)的相关文章

[并发并行]_[C/C++]_[使用线程本地存储Thread Local Storage(TLS)调用复制文件接口的案例]

使用场景: 1. 在复制文件时,一般都是一个线程调用一个接口复制文件,这时候需要缓存数据,如果每个文件都需要创建独立的缓存,那么内存碎片是很大的. 如果创建一个static的内存区,当多线程调用同一个接口时,多个线程同时使用同一个static缓存会造成数据污染.最好的办法是这个缓存只对这个线程可见, 当线程创建时创建缓存区,当线程结束时销毁缓存区. 2. 代码里有注释: test.cpp #include <iostream> #include "pthread.h" #i

[并发并行]_[C/C++]_[使用线程本地存储Thread Local Storage(TLS)-win32和pthread比较]

场景: 1.  需要统计某个线程的对象上创建的个数. 2. 当创建的堆空间需要根据线程需要创建和结束时销毁时. 3. 因为范围是线程只能看到自己的存储数据,所以不需要临界区或互斥量来维护自己的堆内存. 加入如果用全局std::map实现,那么必须在put和get时加锁,这是很损耗资源的. 4. 可以用在维护一个连接,比如socket,database连接. 说明: 1. Java也有自己的线程本地存储ThreadLocal 2. pthread的win32版本: http://sourcewar

TLS (Thread Local Storage)反调试原理

TLS的特别之处在于使得程序的入口点EP不是第一条执行的指令,所以常常用于反调试检测之中. 用一个已经开启的TLS的程序来做说明. 数据结构 TLS存在于PE文件格式之中.IMAGE_DATA_DIRECTORY DataDirectory[9] 存放了TLS目录的地址. winNT.h [F12 可得到定义位置] #define IMAGE_DIRECTORY_ENTRY_TLS 9 // TLS Directory 同其他目录表数组一样,也是8字节结构 (VA+Size) typedef s

TLS 与 python thread local

TLS 先说TLS( Thread Local Storage),wiki上是这么解释的: Thread-local storage (TLS) is a computer programming method that uses static or global memory local to a thread. 线程本地存储(TLS)是一种电脑编程技术, 它用静态或者全局的存储器来保存线程本地的变量(意译). 其目的是为了实现变量隔离,即“同一个”全局变量,对于不同的线程,其值可以不同(类似

HTML5使用local storage存储的数据是如何保存在本地的

HTML5使用local storage存储的数据是如何保存在本地的?(我使用的是chrome浏览器,chrom浏览器是用sqlite来保存本地数据的) HTML5 的local storage 是通过浏览器在本地存储的数据. 基本使用方法如下: <script type="text/javascript"> localStorage.firstName = "Tom"; alert(localStorage.firstName); </scrip

HTML5移动开发之路(19)——HTML5 Local Storage(本地存储)

本文为 兄弟连IT教育 机构官方 HTML5培训 教程,主要介绍:HTML5移动开发之路(19)--HTML5 Local Storage(本地存储) 一.浏览器存储的发展历程 本地存储解决方案很多,比如Flash SharedObject.Google Gears.Cookie.DOM Storage.User Data.window.name.Silverlight.Open Database等. 借用网上的一张图来看下目前主流的本地存储方案: Cookie: 在web中得到广泛应用,但局限

Ionic2学习笔记(8):Local Storage& SQLite

作者:Grey 原文地址: http://www.cnblogs.com/greyzeng/p/5557947.html ? ? ? ? ?Ionic2可以有两种方式来存储数据,Local Storage和SQLite ? LocalStorage ? 因为比较容易访问,所以不适合存比较敏感性的数据 比如可以存储: 用户是否登录的信息. 一些session信息等 具体用法: 进入项目目录:cd MyFirstApp 在主页设置一个按钮,点击按钮,获取LocalStorage的数据并打印在控制台

【JEECG技术博文】Local storage &amp;amp; easyui extensions

1. Local storage背景 cookie弊端:同域内http请求都会带cookie,添加带宽和流量:有个数和限制大小(约4K). 在HTML5中,本地存储是一个window的属性.包含localStorage和sessionStorage.从名字应该能够非常清楚的辨认二者的差别.前者是一直存在本地的,后者仅仅是伴随着session,窗体一旦关闭就没了. 二者用法全然同样. 2. Jquery.storage.js插件 项目主页,api请參考http://ek.alphaschildre

【JEECG技术博文】Local storage &amp; easyui extensions

1. Local storage背景 cookie弊端:同域内http请求都会带cookie,增加带宽和流量:有个数和大小限制(约4K). 在HTML5中,本地存储是一个window的属性,包括localStorage和sessionStorage,从名字应该可以很清楚的辨认二者的区别,前者是一直存在本地的,后者只是伴随着session,窗口一旦关闭就没了.二者用法完全相同. 2. Jquery.storage.js插件 项目主页,api请参考http://ek.alphaschildren.o

cookie ,session Storage, local storage

先来定义: cookie:是网站为了标识用户身份存储在本地终端的数据,其数据始终在APP请求中存在,会在服务器和浏览器中来回传递 数据大小不超过4k, 可以设置有效期,过了有效期自动删除 session Storage和local Storage 不会自动把数据发给服务器,仅在本地保存, 数据大小可达到5M 存储时间久,不会自己消失,必须自动删除 local Storage:会随窗口关闭而删除 代码: 1 $(function () { 2 $(document).click(function