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

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

  1. #include<iostream>
  2. #include<pthread.h>
  3. #include<unistd.h>
  4. using namespace std;
  5. const int i=5;
  6. __thread int var=i;//两种方式效果一样
  7. //__thread int var=5;//
  8. void* worker1(void* arg);
  9. void* worker2(void* arg);
  10. int main(){
  11. pthread_t pid1,pid2;
  12. //__thread int temp=5;
  13. static __thread  int temp=10;//修饰函数内的static变量
  14. pthread_create(&pid1,NULL,worker1,NULL);
  15. pthread_create(&pid2,NULL,worker2,NULL);
  16. pthread_join(pid1,NULL);
  17. pthread_join(pid2,NULL);
  18. cout<<temp<<endl;//输出10
  19. return 0;
  20. }
  21. void* worker1(void* arg){
  22. cout<<++var<<endl;//输出 6
  23. }
  24. void* worker2(void* arg){
  25. sleep(1);//等待线程1改变var值,验证是否影响线程2
  26. cout<<++var<<endl;//输出6
  27. }

程序输出:

6

6         //可见__thread值线程间互不干扰

10

更多0
  • 转载自:http://blog.csdn.net/liuxuejiang158blog/article/details/14100897
  • 多线程编程--- __thread关键字的更多相关文章

    1. Java多线程编程——volatile关键字

      (本篇主要内容摘自<Java多线程编程核心技术>) volatile关键字的主要作用是保证线程之间变量的可见性. package com.func; public class RunThr ...

    2. 【转】 Linux下的多线程编程

      作者:gnuhpc 出处:http://www.cnblogs.com/gnuhpc/原文链接:http://www.cnblogs.com/gnuhpc/archive/2012/12/07/280 ...

    3. Linux下的多线程编程

      1 引言 线程(thread)技术早在60年代就被提出,但真正应用多线程到操作系统中去,是在80年代中期,solaris是这方面的佼佼者.传统的 Unix也支持线程的概念,但是在一个进程(proces ...

    4. Linux下多线程编程

      一.为什么要引入线程? 使用多线程的理由之一是和进程相比,它是一种非常"节俭"的多任务操作方式.在Linux系统下,启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维 ...

    5. 【转】Linux下的多线程编程

      1 引言 线程(thread)技术早在60年代就被提出,但真正应用多线程到操作系统中去,是在80年代中期,solaris是这方面的佼佼者.传统的 Unix也支持线程的概念,但是在一个进程(proces ...

    6. 《转》Linux下的多线程编程

      原地址:http://linux.chinaunix.net/doc/program/2001-08-11/642.shtml 1 引言 线程(thread)技术早在60年代就被提出,但真正应用多线程 ...

    7. ZT 为什么pthread_cond_t要和pthread_mutex_t同时使用 || pthread/Linux多线程编程

      为什么线程同步的时候pthread_cond_t要和pthread_mutex_t同时使用 (2009-10-27 11:07:23) 转载▼ 标签: 杂谈 分类: 计算机 举一个例子(http:// ...

    8. linux下C++的多线程编程

      1. 引言 线程(thread)技术早在60年代就被提出,但真正应用多线程到操作系统中去,是在80年代中期,solaris是这方面的佼佼者.传统的Unix也支持线程的概念,但是在一个进程(proces ...

    9. Linux C++的多线程编程(转)

      1. 引言 线程(thread)技术早在60年代就被提出,但真正应用多线程到操作系统中去,是在80年代中期,solaris是这方面的佼佼者.传统的Unix也支持线程的概念,但是在一个进程(proces ...

    随机推荐

    1. dp + 组合数 Codeforces Beta Round #9 (Div. 2 Only) D

      http://codeforces.com/problemset/problem/9/D 题目大意:给你一个二叉树和n个数字,满足左小右大,能形成多少种不同的二叉树 思路:定义dp[i][j]表示目前 ...

    2. Qt 学习之路 2(84):Repeater

      前面的章节我 们介绍过模型视图.这是一种数据和显示相分离的技术,在 Qt 中有着非常重要的地位.在 QtQuick 中,数据和显示的分离同样也是利用这种"模型-视图"技术实现的.对 ...

    3. Learn about images & containers

      Learn about images & containers Docker Engine provides the core Docker technology that enables i ...

    4. zabbix metrics

      http://blog.csdn.net/hengyunabc/article/details/44072285

    5. androidstudio 问题

      Error:(1, 1) A problem occurred evaluating project ':app'. > Failed to apply plugin [id 'com.andr ...

    6. linux centos下安装g++

      1.查看是否安装 g++ -v 2.命令直接安装 yum install gcc-c++ 3.提示你找不到g++安装包,执行下面命令 yum install gcc-c++ libstdc++-dev ...

    7. seo优化 标点符号

      一.顿号“.” 顿号是一个只有在中文中使用的标点符号,这在英文中没有.毕竟该不该在标题中使用顿号呢,建议大家仍是不要使用,或者说在标题中就不要泛起中文的符号最好.不外,顿号可以使用在Descripti ...

    8. navicat连接oracle时发现 ORA-12737 set CHS16GBK

      oracle安装目录下找到目录:\product\11.2.0\dbhome_1\BIN, 将箭头标注的三个文件(截图中为navicat中的目录,已经测试成功,亲们可以参考)从目录中拷贝纸navica ...

    9. alert()显示中文出现乱码

      1.如果是外部调用 <script language="javascript" type="text/javascript" src="tswc ...

    10. Element type "bean" must be followed by either attribute specifications, ">" or "/>".

      在这里其他内容就省了,错在,<bean id="bpcsU1gblDAO"class="dao.jk.bpcs.impl.BpcsU1gblDaoImpl" ...