方法里的局部非静态变量,多线程访问时为什么会被共享了?

时间:2021-08-16 19:30:09
C++ 多线程 变量共享

7 个解决方案

#1


如果你的变量没有加 static, 那么每个线程进入这个函数时会从线程的栈里面来分配变量, 是不会被共享的.
如果你加了 static, 那就相当于全局变量, 是所有线程共享的了.

#2


To:adlay,谢谢回复!
没有加static,就是主函数外部定义的int类型的非静态成员变量index ,然后主函数的最开始处初始化index的值为0,主函数中还会调用其他函数例如AA,函数AA里会使用这个外部定义的变量index,并对其++。不知道是不是因为定义的地方不对,但我必须把index定义在主函数外面,因为主函数里要调用的方法AA需要使用这个index。

#3


如果多线程访问同一个变量,需要对这个变量进行加锁,如临界区等

#4


To:paschen,谢谢回复!
正常应该不会这样的,不知道犯的什么错,难道真要加锁吗,我没做过,我研究一下。

#5


我做了下实验,这个index不在主函数外定义了 ,而是定义在主函数里,调用其他函数AA时,作为实参传入,这样就正常了。虽然可以解决问题,但之前的问题确实不明就里。

#6


引用 楼主 xiaoge22275 的回复:
我在主函数里定义了一个int类型的局部变量,


引用 2 楼 xiaoge22275 的回复:
没有加static,就是主函数外部定义的int类型的非静态成员变量index ,


你究竟是定义在函数里的局部变量还是定义在函数外的全局变量? 自己说来都是矛盾的.
如果是在函数外, 全局变量当然是共享的了.

#7


第一次说的是错的,是定义在主函数外面。我现在定义在里面就正常了。我也知道问题在哪里了,写JAVA写多了,每个文件就是一个类,里面定义的类成员变量如果不加static就不是全局的,只属于类的实例。。。可是在C里我没有用到类,我习惯性地把定义在函数外部的非静态变量也当成非全局了。。。 方法里的局部非静态变量,多线程访问时为什么会被共享了?

引用 5 楼 xiaoge22275 的回复:
我做了下实验,这个index不在主函数外定义了 ,而是定义在主函数里,调用其他函数AA时,作为实参传入,这样就正常了。虽然可以解决问题,但之前的问题确实不明就里。

#1


如果你的变量没有加 static, 那么每个线程进入这个函数时会从线程的栈里面来分配变量, 是不会被共享的.
如果你加了 static, 那就相当于全局变量, 是所有线程共享的了.

#2


To:adlay,谢谢回复!
没有加static,就是主函数外部定义的int类型的非静态成员变量index ,然后主函数的最开始处初始化index的值为0,主函数中还会调用其他函数例如AA,函数AA里会使用这个外部定义的变量index,并对其++。不知道是不是因为定义的地方不对,但我必须把index定义在主函数外面,因为主函数里要调用的方法AA需要使用这个index。

#3


如果多线程访问同一个变量,需要对这个变量进行加锁,如临界区等

#4


To:paschen,谢谢回复!
正常应该不会这样的,不知道犯的什么错,难道真要加锁吗,我没做过,我研究一下。

#5


我做了下实验,这个index不在主函数外定义了 ,而是定义在主函数里,调用其他函数AA时,作为实参传入,这样就正常了。虽然可以解决问题,但之前的问题确实不明就里。

#6


引用 楼主 xiaoge22275 的回复:
我在主函数里定义了一个int类型的局部变量,


引用 2 楼 xiaoge22275 的回复:
没有加static,就是主函数外部定义的int类型的非静态成员变量index ,


你究竟是定义在函数里的局部变量还是定义在函数外的全局变量? 自己说来都是矛盾的.
如果是在函数外, 全局变量当然是共享的了.

#7


第一次说的是错的,是定义在主函数外面。我现在定义在里面就正常了。我也知道问题在哪里了,写JAVA写多了,每个文件就是一个类,里面定义的类成员变量如果不加static就不是全局的,只属于类的实例。。。可是在C里我没有用到类,我习惯性地把定义在函数外部的非静态变量也当成非全局了。。。 方法里的局部非静态变量,多线程访问时为什么会被共享了?

引用 5 楼 xiaoge22275 的回复:
我做了下实验,这个index不在主函数外定义了 ,而是定义在主函数里,调用其他函数AA时,作为实参传入,这样就正常了。虽然可以解决问题,但之前的问题确实不明就里。