TLS线程局部存储--thread_specific_ptr

大多数函数都不是可重入的。这也就是说在某一个线程已经调用了一个函数时,如果你再调用同一个函数,那么这样是不安全的。一个不可重入的函数通过连续的调用来保存静态变量或者是返回一个指向静态数据的指针。 举例来说,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;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/509191.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

icpc青岛栈

1001-I Count Two Three 题意&#xff1a;给出一个整数n, 找出一个大于等于n的最小整数m, 使得m可以表示为2a3b5c7d。 分析&#xff1a;很好想&#xff0c;因为数据是在1~1e9之间的&#xff0c;所以直接将所有2a3b5c7d的形式且小于1e9的数字打表&#xff0c;然后二分搜索出大于…

互斥锁和条件变量

转自&#xff1a;https://www.jb51.net/article/102764.htm mutex体现的是一种竞争&#xff0c;我离开了&#xff0c;通知你进来。 cond体现的是一种协作&#xff0c;我准备好了&#xff0c;通知你开始吧。 互斥锁一个明显的缺点是它只有两种状态&#xff1a;锁定和非锁定。…

jetty优秀文章转载

地址&#xff1a;https://www.cnblogs.com/yiwangzhibujian/p/5845623.html

UNet详解(转)

Unity Networking&#xff08;UNet&#xff09;函数时序统计和分析 背景和概述 Unity Networking是官方自Unity5.1以来推出的新网络通信解决方案。UNet是非官方但更民间更精简的叫法。 本文需要读者有基础的UNet知识。 了解UNet时序&#xff0c;可以更好更严谨地编写UNet相…

GET和POST两种基本请求方法的区别

转载地址:https://www.cnblogs.com/logsharing/p/8448446.html GET和POST是HTTP请求的两种基本方法&#xff0c;要说它们的区别&#xff0c;接触过WEB开发的人都能说出一二。 最直观的区别就是GET把参数包含在URL中&#xff0c;POST通过request body传递参数。 你可能自己写过…

icpc大连栈

赛时只出了两题 09 10 06卡死了。很烂&#xff0c;没有及时弃疗06&#xff0c;最后得不偿失 丢人。 1001 Different Circle Permutation&#xff08;矩快polya欧拉函数&#xff09; 题目大意&#xff1a;n个座位围成一圈&#xff0c;n个人中挑出若干个人坐下&#xff0c;要求…

Ubuntu14.04 VSCode工程在root下无运行,在非root无法修改配置文件

转自:https://blog.csdn.net/wenyun_kang/article/details/69389784 vscode的配置文件被加上了root权限 把配置文件的root权限去掉就好了 cd ~/.config sudo rm -rf ./Code/ 然后输入密码就好了 猜测原因:vscode在打开的时候需要改动一些配置文件,但是启动的时候发现文件…

jetty优秀文章

地址&#xff1a;http://hbiao68.iteye.com/category/291430

Ubuntu14.04 Apollo 3.5安装

一.安装git lfs 1. 安装crul &#xff1a; curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash 2. 安装 git-lfs&#xff1a; sudo apt-get --yes --force-yes install git-lfs 确保git-lfs正确安装 &#xff1a;git lfs ins…

查询数据库每天更新的数量

select LEFT(FROM_UNIXTIME(pdate),10),count(LEFT(FROM_UNIXTIME(pdate),10)) from tablename where pdate > 1536944461 and pdate < 1539593178 GROUP BY LEFT(FROM_UNIXTIME(pdate),10)

职场那些事

转自&#xff1a;https://www.zhihu.com/question/49209215 1.没有时间观念 任何集体环境中&#xff0c;没有时间观念都是大忌。尤其在职场团队协作过程中&#xff0c;每个人都有自己的位置&#xff0c;每个人的时间都是宝贵的。工作是环环相扣的&#xff0c;因为你的延期导…

顺序表应用4-2:元素位置互换之逆置算法(数据改进)

Problem Description 一个长度为len(1<len<1000000)的顺序表&#xff0c;数据元素的类型为整型&#xff0c;将该表分成两半&#xff0c;前一半有m个元素&#xff0c;后一半有len-m个元素&#xff08;1<m<len)&#xff0c;设计一个时间复杂度为O(N)、空间复杂度为O(…

HtmlUnit优秀文章

博客地址:https://www.cnblogs.com/davidwang456/articles/8693050.html https://blog.csdn.net/anLA_/article/details/50199815

主程成长之路

原文&#xff1a;https://blog.csdn.net/hackmind/article/details/48137233 0x01、技术 1、技术是程序员吃饭的手艺&#xff0c;打磨自己的手艺肯定无可厚非 2、保持对技术的热爱&#xff0c;不断学习&#xff0c;持续编程 3、有敬畏心&#xff0c;明白自己是在做商业项目…

顺序表应用7:最大子段和之分治递归法

Problem Description 给定n(1<n<50000)个整数&#xff08;可能为负数&#xff09;组成的序列a[1],a[2],a[3],…,a[n],求该序列如a[i]a[i1]…a[j]的子段和的最大值。当所给的整数均为负数时定义子段和为0&#xff0c;依此定义&#xff0c;所求的最优值为&#xff1a; Max{…

WebMagic写的网络爬虫优秀文章

博客地址: https://www.cnblogs.com/yanduanduan/p/6527359.html https://www.cnblogs.com/tibit/p/7136762.html https://blog.csdn.net/qq_36251958/article/details/79313035#commentBox

向量内积(点乘)和外积(叉乘)概念及几何意义

向量的内积&#xff08;点乘&#xff09; 定义 概括地说&#xff0c;向量的内积&#xff08;点乘/数量积&#xff09;。对两个向量执行点乘运算&#xff0c;就是对这两个向量对应位一一相乘之后求和的操作&#xff0c;如下所示&#xff0c;对于向量a和向量b&#xff1a; a和b…

SVN分支/合并

转自&#xff1a;https://blog.csdn.net/e3002/article/details/21469437 先说说什么是branch。按照Subversion的说法&#xff0c;一个branch是某个development line&#xff08;通常是主线也即trunk&#xff09;的一个拷贝&#xff0c;见下图&#xff1a; branch存在的意义在…

全国省市直辖市列表

爬取来源&#xff1a;http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/2015/34.html 结果&#xff1a; 云南省 昆明市/曲靖市/玉溪市/保山市/昭通市/丽江市/普洱市/临沧市/楚雄彝族自治州/红河哈尼族彝族自治州/文山壮族苗族自治州/西双版纳傣族自治州/大理白族自治州/德宏傣…

prim算法 求最小生成树

最小生成树Prim算法理解 标签&#xff1a; Prim算法理解最小生成树Prim2014-08-16 18:49 18482人阅读 评论(5) 收藏 举报版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 MST&#xff08;Minimum Spanning Tree&#xff0c;最小生成树&#xff09;问…