线程局部变量__thread关键字

原创 2017年01月03日 15:34:18

__thread是GCC内置的线程局部存储设施,存取效率可以和全局变量相比.__thread变量每一个线程有一份独立实体,各个线程的值互不干扰,可以用来修饰那些带有全局性且值可以变,但是又不值的用全局变量保护的变量.

__thread使用规则:只能修饰POD类型(类似整型指针的标量,不带自定义的构造、拷贝、赋值、析构的类型,二进制内容可以任意复制memset,memcpy,且内容可以复原),不能修饰class类型,因为无法自动调用构造函数和析构函数,可以用于修饰全局变量,函数内的静态变量,不能修饰函数的局部变量或者class的普通成员变量,且__thread变量值只能初始化为编译器常量(值在编译器就可以确定const int i=5,运行期常量是运行初始化后不再改变const int i=rand()).

#include<iostream>
#include<pthread.h>
#include<unistd.h>
static int var = 5;
//__thread int var  = 5; //用__thread修饰
void* worker1(void *arg){
    std::cout << ++var <<std::endl;
}
void* worker2(void* arg){
    sleep(1); //等待线程1改变var的值,看是否影响线程2
    std::cout << ++var <<std::endl;
}
void* worker2(void* arg);
int main(int argc,char *argv[])
{
    pthread_t pid1,pid2;
    static __thread int temp = 10; //修饰函数内的static变量
    pthread_create(&pid1,NULL,worker1,NULL);
    pthread_create(&pid2,NULL,worker2,NULL);
    pthread_join(pid1,NULL);
    pthread_join(pid2,NULL);
    std::cout << temp << std::endl;
   return 0;
}

运行结果:

yang@yang:~/test1$ ./a.out 
6
7
10

注释掉static int var = 5;去掉下面那一行的注释运行:

yang@yang:~/test1$ ./a.out 
6
6
10

每个线程的都有一份独立的var值.

版权声明:本文为博主原创文章,未经博主允许不得转载。

每天进步一点点——Linux中的线程局部存储(二)

Linux C/C++多线程编程中请善用__thread
  • cywosp
  • cywosp
  • 2014年05月24日 22:51
  • 6512

Linux线程属性、线程局部变量总结

转自 http://blog.csdn.net/zsf8701/article/details/7842392 //线程属性结构如下: typedef struct {     int    ...
  • le119126
  • le119126
  • 2015年04月13日 15:09
  • 2324

linux编程 - C/C++每线程(thread-local)变量的使用

在一个进程中定义的全局或静态变量都是所有线程可见的,即每个线程共同操作一块存储区域。而有时我们可能有这样的需求:对于一个全局变量,每个线程对其的修改只在本线程内有效,即每个线程虽然共享这个全局变量的名...
  • jasonchen_gbd
  • jasonchen_gbd
  • 2016年05月12日 01:10
  • 7322

什么是线程局部变量(Thread Local Variable)

ThreadLocal 类是悄悄地出现在 Java 平台版本 1.2 中的。虽然支持线程局部变量早就是许多线程工具(例如 Posix pthreads 工具)的一部分,但 Java Threads ...
  • gemmem
  • gemmem
  • 2012年02月17日 15:52
  • 3006

线程局部变量与 __thread

线程局部变量与 __thread 五竹 线程局部变量与 __thread –五竹,20120/9/03 现在使用多线程开发越来越普遍, 为了提高性能,性能局部变量使用也...
  • jfkidear
  • jfkidear
  • 2012年12月05日 17:44
  • 1625

Thread.interrupt()方法的使用以及使用它退出线程

  • 2014年12月18日 16:49
  • 4KB
  • 下载

Java线程(Java.Thread)(中英版)

  • 2013年08月13日 18:27
  • 21.51MB
  • 下载

线程操作thread

  • 2013年04月13日 23:33
  • 300KB
  • 下载

Java Thread Programming (Sams) java线程编程(含code)

  • 2008年09月26日 19:41
  • 1.28MB
  • 下载

Intel.Thread.Profiler.英特尔®.线程档案器

  • 2007年12月30日 11:36
  • 9MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:线程局部变量__thread关键字
举报原因:
原因补充:

(最多只允许输入30个字)