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

xiaoge22275 2016-08-16 04:56:52
我在主函数里定义了一个int类型的局部变量,在一个for循环中作为数组的访问下标,每循环一次会+1。单线程访问这个方法是正常的,但多线程访问时这个int变量竟然被共享了,同时去递增这个变量值,在多个线程中形成彼此相邻的不连续值,导致访问数组越界出错。我是做JAVA的,对C++不太熟悉,只是为了做个DLL给JAVA调用,之前用得好好的,现在增加了在JAVA中使用多线程去调用这个DLL才发现了问题。我觉得好奇怪,理论上这是不可能的,但由于我对C++的通讯机制不了解,也无从解决,希望有朋友能帮下忙,非常感谢!
...全文
364 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaoge22275 2016-08-16
  • 打赏
  • 举报
回复
第一次说的是错的,是定义在主函数外面。我现在定义在里面就正常了。我也知道问题在哪里了,写JAVA写多了,每个文件就是一个类,里面定义的类成员变量如果不加static就不是全局的,只属于类的实例。。。可是在C里我没有用到类,我习惯性地把定义在函数外部的非静态变量也当成非全局了。。。
引用 5 楼 xiaoge22275 的回复:
我做了下实验,这个index不在主函数外定义了 ,而是定义在主函数里,调用其他函数AA时,作为实参传入,这样就正常了。虽然可以解决问题,但之前的问题确实不明就里。
www_adintr_com 2016-08-16
  • 打赏
  • 举报
回复
引用 楼主 xiaoge22275 的回复:
我在主函数里定义了一个int类型的局部变量,
引用 2 楼 xiaoge22275 的回复:
没有加static,就是主函数外部定义的int类型的非静态成员变量index ,
你究竟是定义在函数里的局部变量还是定义在函数外的全局变量? 自己说来都是矛盾的. 如果是在函数外, 全局变量当然是共享的了.
xiaoge22275 2016-08-16
  • 打赏
  • 举报
回复
我做了下实验,这个index不在主函数外定义了 ,而是定义在主函数里,调用其他函数AA时,作为实参传入,这样就正常了。虽然可以解决问题,但之前的问题确实不明就里。
xiaoge22275 2016-08-16
  • 打赏
  • 举报
回复
To:paschen,谢谢回复! 正常应该不会这样的,不知道犯的什么错,难道真要加锁吗,我没做过,我研究一下。
paschen 2016-08-16
  • 打赏
  • 举报
回复
如果多线程访问同一个变量,需要对这个变量进行加锁,如临界区等
xiaoge22275 2016-08-16
  • 打赏
  • 举报
回复
To:adlay,谢谢回复! 没有加static,就是主函数外部定义的int类型的非静态成员变量index ,然后主函数的最开始处初始化index的值为0,主函数中还会调用其他函数例如AA,函数AA里会使用这个外部定义的变量index,并对其++。不知道是不是因为定义的地方不对,但我必须把index定义在主函数外面,因为主函数里要调用的方法AA需要使用这个index。
www_adintr_com 2016-08-16
  • 打赏
  • 举报
回复
如果你的变量没有加 static, 那么每个线程进入这个函数时会从线程的栈里面来分配变量, 是不会被共享的. 如果你加了 static, 那就相当于全局变量, 是所有线程共享的了.

33,320

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧