局部静态变量的多线程问题

静态局部变量实在第一次访问的时候进行初始化的,先来看下初始化的过程

class base
{
public:
	base(){}
};

void fn()
{
	static base t;
}

首先定义一个类; 初始化过程的汇编

首先取出一个值和1进行比较 ,如果不等把1 复制给这个地址 然后调用base的构造函数进行初始化

根据上下文 可以理解 其实这个地址就是来标记该静态变量是否进行过初始化,如果没有置为1,然户进行初始化。如果为1,则跳过初始化。

下面考虑多线程的环境当线程1 在赋值标志位之前判断标志位之后,切换到线程2,线程2也会判断为未初始化,则 这种情况下base会初始化两次,考虑一种情况,如果构造函数里有申请内存的操作则析构时只会析构后者。会造成内存泄露~ 所以多线程的局部静态变量的初始化也是不安全的~

局部静态变量的多线程问题

时间: 2024-11-07 10:03:29

局部静态变量的多线程问题的相关文章

浅析VB.NET局部静态变量————————【Badboy】

经过长时间学习VB.NET局部静态变量,于是和大家分享一下,看完本文你肯定有不少收获,希望本文能教会你更多东西.VB.NET能够实现很多C#不能做到的功能,如When语句.Optional参数.局部Static变量.对象实例访问静态方法.Handles绑定事件.On Error处理异常.Object直接后期绑定等等.VB和C#同属.NET的语言,编译出来的是同样的CIL,但为什么VB支持很多有趣的特性呢.我们一起来探究一下VB.NET局部静态变量. VB.NET局部静态变量 VB支持用Stati

局部静态变量

1 #pragma region 成员函数的局部静态变量应用 2 class CTestA 3 { 4 public: 5 CTestA(); 6 void ReturnCurrentTime(float currentFrame, float nextFrame); 7 }; 8 9 CTestA::CTestA(){} 10 11 void CTestA::ReturnCurrentTime(float currentFrame, float nextFrame) 12 { 13 stati

PHP引用操作以及外部操作函数的局部静态变量的方法

通过引用方式在外部操作函数或成员方法内部的静态变量 下面举个简单的例子,说明三个关于引用方面的问题: 1. 参数引用后函数内进行类型转换同样是地址操作 2. 参数引用后再传递给其他函数时需要再次添加引用符才能保持地址操作 3. 函数返回值引用必须在函数申明时以及调用时都添加引用操作符 该例子使用的是对象方法的操作,同样适用于函数 <?php class A { public function & test1(& $a) { static $i = 0; var_dump($i); $

一个类成员函数的局部静态变量问题

之前工作中遇到一个问题,就像题目中描述的那样,看起来题目有些拗口复杂,这里解释下,当时遇到的需求需要这样处理:调用某个类对象的某个成员函数时,第一次有具体意义的,其他时候都是保持不变的.无意义的.这个需求可以看做是在调用某成员函数时,第一次进行初始化,其他时候不进行操作,即在首次调用时进行初始化,根据这点,很容易想到c/c++里面的static变量,它的作用是保持变量内容的持久,存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化.根据需求,使用static局部变量,写下

比较全局变量、全局静态变量、局部变量、局部静态变量的区别

比较全局变量.全局静态变量.局部变量.局部静态变量的区别,他们在编译完后存储位置在什么地方.初始化值在什么地方.内存什么时候分配.赋初值对这些变量有哪些影响等.要弄清楚这些问题,首先要弄清楚下面几个知识点. C语言分下面几个存储区: 1.栈区(stack) 由编译器在需要的时候自动分配释放,在不需要的时候就自动清除的变量存储区.通常存放的变量是函数的参数值.局部变量的值等,其操作方式类似于数据结构中的栈. 2.堆区(heap) 一般由程序员去分配释放,和编译器完全没有关系,直接由我们的应用程序去

PHP 的 返回引用(方法名前加&) 和 局部静态变量(static)

先阅读手册==========从函数返回一个引用,必须在函数声明和指派返回值给一个变量时都使用引用操作符 & : 例子 17-13. 由函数返回一个引用 <?php   function &returns_reference()   {       $someref = 0;       return $someref;   }      $newref = &returns_reference();//相当于 $newref = &$someref;   ?>

局部静态变量只能初始化一次是怎么实现?

静态变量可以分为全局静态变量,和局部静态变量,先来说说全局的吧.全局静态变量和全局变量的区别并不大,只是全局静态变量只能在当前文件中使用,而在反汇编中二者并无区别,只可以在当前文件中使用,不过是编译器做出的限制.局部静态变量,会有些特殊,它不会随着作用域结束而消失,在未进入作用于之前就已经存在.局部静态变量和全局变量都保存在二进制文件的数据区,而在代码中的限制,不过是编译器限制而已. 那么当某个函数频繁调用局部静态变量时,C++的语法规定局部静态变量只能初始化一次,那么编译器是怎么做到的呢. 来

【C语言】局部变量、全局变量,局部静态变量,全局静态变量,extern,static的区别

局部变量: 创建在栈区(向下生长),生命周期存在于当前作用域中.     创建时若未初始化,则为随机值. 全局变量: 创建在static区,生命周期一直存在. 创建时若未初始化,则为0. 静态局部变量: 切断了外部链接属性.创建在static区. 创建时若未初始化,则为0. 全局变量和静态变量的存储是放在一块的,初始化了的全局变量和静态变量在一块区域,  未初始化的全局变量和未初始化的静态变量在相邻的另一块区域. 全局静态变量: 切断了外部链接属性,创建在static区,生命周期一直存在. 创建

局部静态变量是如何做到只初始化一次的?

关于编译选项 -Wa,-adlhn参考 http://blog.csdn.net/lanxinju/article/details/5900986 以下内容来自于内网别的高人的回复 可以写个程序测试一下: class A { public: A() {} public: int a; }; int static_var_func() { static A a; return a.a++; } int main(int argc, char * argv[]) { static_var_func(