大多数函数都不是可重入的。这也就是说在某一个线程已经调用了一个函数时,如果你再调用同一个函数,那么这样是不安全的。一个不可重入的函数通过连续的调用来保存静态变量或者是返回一个指向静态数据的指针。 举例来说,std::strtok就是不可重入的,因为它使用静态变量来保存要被分割成符号的字符串。有两种方法可以让不可重用的函数变成可重用的函数。第一种方法就是改变接口,用指针或引用代替原先使用静态数据的地方。比方说,POSIX定义了strok_r,std::strtok中的一个可重入的变量,它用一个额外的char**参数来代替静态数据。这种方法很简单,而且提供了可能的最佳效果。但是这样必须改变公共接口,也就意味着必须改代码。另一种方法不用改变公有接口,而是用本地存储线程(thread local storage)来代替静态数据(有时也被成为特殊线程存储,thread-specific storage)。Boost线程库提供了智能指针boost::thread_specific_ptr来访问本地存储线程。每一个线程第一次使用这个智能指针的实例时,它的初值是NULL,所以必须要先检查这个它的只是否为空,并且为它赋值。Boost线程库保证本地存储线程中保存的数据会在线程结束后被清除。List5是一个使用boost::thread_specific_ptr的简单例子。其中创建了两个线程来初始化本地存储线程,并有10次循环,每一次都会增加智能指针指向的值,并将其输出到std::cout上(由于std::cout是一个共享资源,所以通过互斥体进行同步)。main线程等待这两个线程结束后就退出。从这个例子输出可以明白的看出每个线程都处理属于自己的数据实例,尽管它们都是使用同一个boost::thread_specific_ptr。

#include <boost/thread/thread.hpp>
#include <boost/thread/mutex.hpp>
#include <boost/thread/tss.hpp>
#include <iostream>boost::mutex io_mutex;
boost::thread_specific_ptr<int> ptr;struct count
{count(int id) : id(id) { }void operator()(){if (ptr.get() == 0)ptr.reset(new int(0));for (int i = 0; i < 10; ++i){(*ptr)++;boost::mutex::scoped_locklock(io_mutex);std::cout << id << ": "<< *ptr << std::endl;}}int id;
};int main(int argc, char* argv[])
{boost::thread thrd1(count(1));boost::thread thrd2(count(2));thrd1.join();thrd2.join();return 0;
}

TLS线程局部存储--thread_specific_ptr相关推荐

  1. Linux内存机制浅见——从内存布局到线程局部存储TLS

    先记 最近在重新分析SGX的源码<再回顾sgx_create_enclave>,一路发现,我还需要重新思考ELF文件格式(我在<SGX初始化中ElfParser::run_parse ...

  2. 【windows核心编程】线程局部存储TLS

    线程局部存储TLS, Thread Local Storage TLS是C/C++运行库的一部分,而非操作系统的一部分. 分为动态TSL 和 静态TLS 一.动态TLS 应用程序通过调用一组4个函数来 ...

  3. OpenGL ES EGL TLS(线程局部存储) G3D

    1. 什么是EGL EGL是用来管理绘图表面的(Drawing surfaces),并且提供了如下的机制 (1) 与本地窗口系统进行通信 (2) 查找绘图表面可用的类型和配置信息 (3) 创建绘图表面 ...

  4. java 线程局部存储,转载boost::thread简要分析(3):线程局部存储及其它

    多线程编程中还有一个重要的概念:Thread Local Store(TLS,线程局部存储),在boost中,TLS也被称作TSS,Thread Specific Storage. boost::th ...

  5. Windows PE第九章 线程局部存储

    线程局部存储(TLS) 这个东西并不陌生了,之前写过了一个关于这个的应用,利用静态TLS姿势实现代码段静态加密免杀或者所谓的加壳思路.地址在这:http://blog.csdn.net/u013761 ...

  6. Win32多线程编程(5) — 线程局部存储

    预留内存携带附加信息的设计 有时候,将数据与一个对象的实例关联起来是很有帮助的.这种设计要求预留一定的内存,一倍特定附加数据的存储. 通过调用SetWindowWord或SetWindowLong函数 ...

  7. 大内高手—共享内存与线程局部存储

    城里的人想出去,城外的人想进来.这是<围城>里的一句话,它可能比<围城>本身更加有名.我想这句话的前提是,要么住在城里,要么住在城外,二者只能居其一.否则想住在城里就可以住在城 ...

  8. 3.3设计自己的线程局部存储

    TLS 在实际的应用过程中,往往使用 TLS(Thread Local Storage,线程局部存储)保存与各线程相关联的指针,指针指向的一组数据是在进程的堆中申请的.这样就可以保证,每个线程只访问与 ...

  9. 第三章 线程局部存储 windows程序设计 王艳平版

    /// // 02UseTLS.cpp.cpp文件 /* 动态调TLS的典型步聚: 1,主线程调用TlsAlloc函数为线程局部存储分配索引 DWORD TlsAlloc(void) 返回一个TLS索 ...

最新文章

  1. 用 Python 写一个天天酷跑,在线摸鱼不烦恼
  2. ResNet在计算机视觉中的应用
  3. C/S架构和B/S架构介绍
  4. python的类和对象——类的静态字段番外篇
  5. Spring Boot2.0之 整合Redis集群
  6. 树莓派:在ubuntu20-server安装和卸载桌面
  7. 相关滤波跟踪(MOSSE)
  8. BlueStore——先进的用户态文件系统《一》
  9. shopee虾皮科技测试工程师第一次笔试
  10. armv8 汇编 绝对地址赋值_详解汇编语言B和LDR指令与相对跳转和绝对跳转的关系...
  11. dreamhost 优惠码_DreamHost如何通过OpenStack重塑自己
  12. SpringBoot:Spring boot 主程序的功能SpringApplication.run(启动流程)
  13. .txt文件改成.bat为什么没有反应
  14. PDF阅读器哪个好用?看完这篇文章就可以不用再问了
  15. 人工智能(AI)测试方法
  16. Python3 网络爬虫:视频下载,那些事儿!
  17. java 中rest,Java中的REST调用
  18. 科思创为全新概念车丰田LQ提供可持续解决方案
  19. 我眼中的未来计算机作文1000字,我的未来作文1000字
  20. 深圳东部公交WIFI试用体验

热门文章

  1. 顶级程序员的心得 - Coders at Work
  2. php 共享内存列队,php中对共享内存,消息队列的操作
  3. 前端跨域请求get_(单点登录)跨域SSO看这篇文章就够了:前端篇
  4. collector list 多个分组_Java 8嵌套(多级)分组依据
  5. sqoop从oracle导入hive分区,sqoop从oracle导入hive Hive exited with status 64
  6. mongoose 批量修改字段_WordPress图片路径批量替换方法
  7. linux redis 主从配置,redis集群(主从配置)
  8. k8s 查看ip地址属于哪个pod_一个简单的例子理解Kubernetes的三种IP地址类型
  9. matlab ode45求解齿轮动力学,ode45求解多自由度动力学方程实例.doc
  10. div中的p标签于img设置同一水平_前端工程师:css中一些需要注意的东西