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

关键字

   __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=; typedef struct context_t
{
int p1;
char name[];
}context; __thread context ctx; void product(char *name)
{
static __thread int i = ;
printf("--->%s:%d\n",name, ++i);
} void* worker1(void*arg);
void* worker2(void*arg); int main()
{
pthread_t pid1,pid2;
memset(&ctx, , sizeof(context));
ctx.p1 = ;
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 ;
}
void* worker1(void* arg)
{
strcpy(ctx.name, "lilei");
ctx.p1=;
printf("work1:%d \n", ++var);
printf("work1:%d, name=%s\n", ctx.p1, ctx.name);
product("work1");
}
void* worker2(void* arg)
{
sleep();
printf("work2:%d \n", ++var);
printf("work2:%d, name=%s\n", ctx.p1, ctx.name);
product("work2");
}

输出结果:

[root@localhost test]# gcc -lpthread -o test test.c
[root@localhost test]# ./test
work1:
work1:, name=lilei
--->work1:
work2:
work2:, name=
--->work2:
exit, var:, p1:, 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

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

  1. 线程本地存储(Thread Local Storage, TLS)简单分析与使用

    在多线程编程中, 同一个变量, 如果要让多个线程共享访问, 那么这个变量可以使用关键字volatile进行声明; 那么如果一个变量不想使多个线程共享访问, 那么该怎么办呢? 呵呵, 这个办法就是TLS ...

  2. 线程本地存储TLS(Thread Local Storage)的原理和实现——分类和原理

    原文链接地址:http://www.cppblog.com/Tim/archive/2012/07/04/181018.html 本文为线程本地存储TLS系列之分类和原理. 一.TLS简述和分类 我们 ...

  3. 线程本地存储TLS(Thread Local Storage)的原理和实现——分类和原理

    本文为线程本地存储TLS系列之分类和原理. 一.TLS简述和分类 我们知道在一个进程中,所有线程是共享同一个地址空间的.所以,如果一个变量是全局的或者是静态的,那么所有线程访问的是同一份,如果某一个线 ...

  4. 线程局部存储TLS(thread local storage)

    同一全局变量或者静态变量每个线程访问的是同一变量,多个线程同时访存同一全局变量或者静态变量时会导致冲突,尤其是多个线程同时需要修改这一变量时,通过TLS机制,为每一个使用该全局变量的线程都提供一个变量 ...

  5. TLS Thread Local Storage

    https://blog.csdn.net/yusiguyuan/article/details/22938671 https://blog.csdn.net/simsunny22/article/d ...

  6. TLS 与 python thread local

    TLS 先说TLS( Thread Local Storage),wiki上是这么解释的: Thread-local storage (TLS) is a computer programming m ...

  7. Java Thread Local – How to use and code sample(转)

    转载自:https://veerasundar.com/blog/2010/11/java-thread-local-how-to-use-and-code-sample/ Thread Local ...

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

    作者:Grey 原文地址: http://www.cnblogs.com/greyzeng/p/5557947.html              Ionic2可以有两种方式来存储数据,Local S ...

  9. Web持久化存储Web SQL、Local Storage、Cookies(常用)

    在浏览器客户端记录一些信息,有三种常用的Web数据持久化存储的方式,分别是Web SQL.Local Storage.Cookies. Web SQL 作为html5本地数据库,可通过一套API来操纵 ...

  10. cookie ,session Storage, local storage

    先来定义: cookie:是网站为了标识用户身份存储在本地终端的数据,其数据始终在APP请求中存在,会在服务器和浏览器中来回传递 数据大小不超过4k, 可以设置有效期,过了有效期自动删除 sessio ...

随机推荐

  1. Azure降价辣么多,省下的预算该怎么花?

    那么 Azure 产品创新以及服务完善到底体现在何处呢?以下最新发布内容也许可以告诉你答案. ◆ ◆ ◆ Power BI Embedded 让应用中的数据更加生动 Microsoft Power B ...

  2. 源码安装zabbix3.2.7时PHP ldap Warning

    问题如下: 解决方法: 1.首先查看源码安装的php模块中是否有ldap.so [root@nms ldap]# ll  /usr/local/php/lib/php/extensions/no-de ...

  3. vm中efi模式安装windows10

    选择dvd: 界面出现“Press any key to boot from CD or DVD”时,再迅速按下任意键就OK了.

  4. nutzwk运行后wk-web中生成ehcache.disk.store.dir有什么用,怎么去掉

    nutzwk运行后wk-web中生成ehcache.disk.store.dir有什么用,怎么去掉  发布于 29天前  作者 qq_96c46988  64 次浏览  复制  上一个帖子  下一个帖 ...

  5. ES6 初体验 —— gulp+Babel 搭建ES6环境

    ES6已经火了好久了,我却一直没有在项目中尝试过使用ES6写代码,只是写过几个Demo,在大型项目中使用ES6这件事,我一直不太敢做.最近公司要求做一个小的H5活动专题,我想不如就在这个小项目中使用E ...

  6. C# for语句

    一.C# for语句 for语句是C#语言中使用频率最高的循环语句. 1. for语句 语法格式如下: for(initializer; condition; iterator){    embedd ...

  7. json对象与字符串相互转换

    JSON 语法 JSON 语法规则 在 JS 语言中,一切都是对象.因此,任何支持的类型都可以通过 JSON 来表示,例如字符串.数字.对象.数组等.但是对象和数组是比较特殊且常用的两种类型: 对象表 ...

  8. Java分享笔记:Map集合(接口)的基本方法程序演示

    package pack02; import java.util.*; public class MapDemo { public static void main(String[] args) { ...

  9. tcp回显客户端发送的数据

    客户端: import socket tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) tcp_socket.connect ...

  10. 6-1 md5加密

    1.导入hashlib模块,使用它的md5方法进行加密 import hashlib # import md5 python2 s = 'admin123' # .将字符串类型转换成byte类型才能加 ...