社区
C语言
帖子详情
为什么多线程下全局变量会被莫名修改
N0TEAR
2011-05-24 08:28:32
一个线程函数A,本来是让它在主线程之外的另一个线程里运行的,但只要这个A一运行,一个很关键的全局变量G就会被莫名修改,而如果让这个A在主线程里单线程运行的话G就不会被修改。在多线程下用watch G调试只能看到G被修改,提示被修改的那一行并没有任何意义,纯粹是主线程当时运行到哪一行它就停在哪一行。
为什么会这样?
...全文
273
4
打赏
收藏
为什么多线程下全局变量会被莫名修改
一个线程函数A,本来是让它在主线程之外的另一个线程里运行的,但只要这个A一运行,一个很关键的全局变量G就会被莫名修改,而如果让这个A在主线程里单线程运行的话G就不会被修改。在多线程下用watch G调试只能看到G被修改,提示被修改的那一行并没有任何意义,纯粹是主线程当时运行到哪一行它就停在哪一行。 为什么会这样?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
4 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
N0TEAR
2011-05-24
打赏
举报
回复
[Quote=引用 2 楼 q191201771 的回复:]
这也是为什么经常说避免使用全局变量
[/Quote]
唉,一直不知道原来还有这个副作用
N0TEAR
2011-05-24
打赏
举报
回复
[Quote=引用 1 楼 jackyjkchen 的回复:]
那是当然的,多线程在单步调试状态下实际上不是并行的。
一般多线程程序里的可写全局变量都是隐形炸弹,应该想办法避免
[/Quote]
明白了,多谢
就想叫yoko
2011-05-24
打赏
举报
回复
这也是为什么经常说避免使用全局变量
jackyjkchen
2011-05-24
打赏
举报
回复
那是当然的,多线程在单步调试状态下实际上不是并行的。
一般多线程程序里的可写全局变量都是隐形炸弹,应该想办法避免
【
全局变量
会
变】的原因&(全局数组内容异常)
全局变量
的值
会
变的原因&(全局数组内容异常)。
C++
全局变量
值被
修改
一个
全局变量
的值在执行某个函数是被
莫名
修改
了。为验证
全局变量
的改动情况,写了一部分代码用于测试
全局变量
被异常
修改
问题解决思路
系统函数(strcpy, strcmp...)导致越界,将这些不安全的函数暂时屏蔽或者使用带限制的函数(strncpy, strncmp...)等替换进行验证是否解决。数据/指针越界,这种时候需要查看map文件,查看被
修改
全局变量
的附近是否有频繁
修改
的数据或者指针,尝试将附近的数据增大,查看是否解决问题。栈溢出,通过将栈空间增大或者将原来由栈分配的大数据改为全局数据,这样进行验证是否解决。中断中
修改
,操作时可通过开关中断来进行临界保护,验证是否能解决。
多线程
抢占,可通过加锁来验证是否为此原因导致。
C语言
全局变量
被
莫名
修改
,在中断程序里
修改
全局变量
的童鞋注意啦-C中的volatile作用...
一个定义为volatile的变量是说这变量可能
会
被意想不到地改变,这样,编译器就不
会
去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子:1). 并行设备的硬件寄存器(如:状态寄存器)2). 一个中断服务子程序中
会
访问到的非自动变量(Non-automatic variables)3)....
编程陷阱_变量被
莫名
修改
编程陷阱_
全局变量
被
莫名
修改
源代码错误点通道号更新导致情况 原工程作用,QT中查询10个通道的数据,定义个数组记录每个通道的时间戳,轮询每个通道 源代码 错误点 CHANNEM_NUM_MAX 定义为 10 通道号更新 目标是轮询通道号 1 - 10 判断条件如下 导致情况
修改
channel_datacnt[10]数据时,database_sem_id变量被更改 编程中切记,数组越界访问问题,数组后面定义了变量可能不
会
段错误而是后面的变量被偷偷的
修改
了! 另外,在RTOS操作系统中,线程栈的大小定义过
C语言
70,040
社区成员
243,246
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章