__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. ios7.1 masonry布局中出现的问题

      UITextView中如果添加了子空间,比如自己添加一个placeHolder,placeHolder的Label使用masonry布局,会出现崩溃,原因是:在UITextView没有对子控件进行布局 ...

    2. Tomcat配置远程调试端口

      Tomcat配置远程调试端口 1.Linxu系统: apach/bin/startup.sh开始处中增加如下内容: declare -x CATALINA_OPTS="-server -Xd ...

    3. actor

      _timcharper1月 20 02:18 @timcharper , so what app the actor model can help, and what app the thread m ...

    4. 利用css的border实现画三角形思路原理

      1.利用Css 的border绘制三角形的原理: div的border是有宽度和颜色的,当div的宽度比较大的时候,比如上面代码每个边100像素,颜色又不一样,浏览器怎么渲染颜色呢?经测试发现,宽度较 ...

    5. java操作oracle的blob,clob数据

      一.区别和定义 LONG: 可变长的字符串数据,最长2G,LONG具有VARCHAR2列的特性,可以存储长文本一个表中最多一个LONG列 LONG RAW: 可变长二进制数据,最长2G CLOB:  ...

    6. 【递归与分治】 poj 1017

      递归与分治经典例题    要点在于对3*3箱子的讨论 #include <iostream> #include <cstdio> using namespace std; in ...

    7. selenium2(WebDriver) API

      selenium2(WebDriver) API 作者:Glen.He出处:http://www.cnblogs.com/puresoul/  1.1  下载selenium2.0的包 官方downl ...

    8. 破解MyEclipse2013注册码

      1.下载破解工具 http://down8.3987.com:801/2010/Myeclipse_zcj.3987.com.rar 2.打开 找到meclipse安装路径找到plugins文件夹打开 ...

    9. Jenkins+SonarQube代码质量检查自动化

      基础概念百度百科:Jenkins是基于Java开发的一种持续集成工具,用于监控持续重复的工作,功能包括:1.持续的软件版本发布/测试项目.2.监控外部调用执行的工作.前面[Sonarqube 代码质量 ...

    10. 80x86的3种工作方式

      80x86中的32位CPU全面支持32位的数据.指令和寻址方式,提供了3种工作方式:是地址方式.保护方式和保护方式下的虚拟8086方式.在计算机上电或复位后,32位CPU首先初始化为是地址方式,再通过 ...