【Boost】boost库中thread多线程详解9——thread_specific_ptr线程局部存储
2016-01-26 14:26
459 查看
大多数函数都不是可重入的。这也就是说在某一个线程已经调用了一个函数时,如果你再调用同一个函数,那么这样是不安全的。一个不可重入的函数通过连续的调用来保存静态变量或者是返回一个指向静态数据的指针。 举例来说,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。
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_lock lock(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; }
相关文章推荐
- mansory使用记录&&NSLayoutConstraint-代码实现自动布局
- Maven配置Spring+SpringMVC+MyBatis(3.2.2)Pom 以及 IntelliJ IDEA 如何打开依赖视图
- Oracle 删除重复数据只留一条
- OpenCV 配置的注意事项
- 分类器是如何做检测的?——CascadeClassifier中的detectMultiScale函数解读
- 加入QQ交流群,即可免费获得unigine2013源代码
- CentOS中安装lvs
- Android Studio打包APK时出现 is not translated in "en" (English) [MissingTranslation]
- CI框架 -- 核心文件 之 Hooks.php
- Spark 配置指南
- SNMP监控一些常用OID的总结
- UITextField输入框的字靠右一点显示
- 【Boost】boost库中thread多线程详解8——call_once仅运行一次
- 当当开源sharding-jdbc,轻量级数据库分库分表中间件
- 网页版计算器的实现(js实现计算功能)
- Xcode升级插件失效 | 错误选择了Skip Bundle
- HashMap的扩容
- HDU-1267 下沙的沙子有几粒?
- Insert into select 与create table as的性能测试及create table
- 欢迎使用CSDN-markdown编辑器