首页
社区
课程
招聘
[求助]菜鸟问题,同一线程中的一行代码会因为其它事件的发生而被中途打断吗?
发表于: 2014-8-19 10:20 5870

[求助]菜鸟问题,同一线程中的一行代码会因为其它事件的发生而被中途打断吗?

2014-8-19 10:20
5870
比如,我在给一个全局变量自加1,此时有按钮点击事件发生,在该按钮事件中也会给这个变量自加1,因为VC中一行代码翻译为汇编会变为几行代码,如果这几行汇编代码只执行了一部份的话,会使变量值并不会按编程者的意思来自加。

不知道我有没有表达清楚,就是在多线程中访问同一个变量的话,如果不做特殊处理的话,会出问题。那么在同一个线程中,因为事件的发生,也会出现这种问题吗?因为当有事件的时候,应该CPU会放下手中工作,去处理这个事件吧?

[课程]Android-CTF解题方法汇总!

收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 61
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
同一线程,不会
2014-8-19 10:59
0
雪    币: 7068
活跃值: (3517)
能力值: ( LV12,RANK:340 )
在线值:
发帖
回帖
粉丝
3
你的按钮事件肯定是通过消息队列来通知你的程序的啊。
你在外部给全局变量+1时,此时就算有按钮消息发送,你的程序也处理不了啊。
等你的代码执行完全局变量+1,进入消息循环里才会处理按钮消息的。

你要搞清楚,不是你点击了按钮,线程就会去处理你的按钮事件。
你点击了按钮不过是把按钮被点击的消息发送的线程的消息队列里面去了。
你的线程需要GetMessage或者PeekMessage来处理。
2014-8-19 12:08
0
雪    币: 350
活跃值: (87)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
4
同一个线程中就不会出现这个问题
2014-8-19 13:05
0
雪    币: 8
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
   这样说是明白了点  但是既然window是消息驱动的  程序做着的都是响应相应的消息   那么我们这个程序中的+1    实质上是在响应什么消息啊
2014-8-19 15:03
0
雪    币: 61
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
咦,不是LZ了啊。说明白点啊,哪个+1哦?
2014-8-19 15:44
0
雪    币: 6092
活跃值: (654)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
7
一般情况下,按钮事件是wm_common消息。你可以通过spy++来捕捉消息的
2014-8-25 08:23
0
雪    币: 112
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
让CPU停止当前执行的线程通常只有两种情况,一个是遇到了中断,另一个就是线程被调度等待。Windows的事件是不一定会强行中断当前执行的代码流的。
2014-8-25 10:08
0
雪    币: 8
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
   哦。。是不是一般我们自己写的一些语句  都是在wm_common消息中执行的啊?而且我记得好像还有一个WM_USER(好像是)的消息哦   是不是程序中没有定义   系统就不会传递这个消息给程序啊?
2014-8-26 01:28
0
雪    币: 23
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
一、楼主说情况,如果是在“多线程界面”编程里是有可能发生的,在没 执行完主线程的+1,就会提前响应按扭消息,但看好,只限于多线程,因为有可能没执行完加1就被系统按时间片调度了。
二、针对这种情况,咱们的VC里有一种叫技术叫临界区,EnterCriticalSection进入,LeaveCriticalSection退出,便实现了全局性的资源同步,具体如何操作,请baidu.
2014-8-26 07:14
0
雪    币: 123
活跃值: (144)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
11
参见InterLockedIncrement,其实就一句代码:
lock inc dword ptr [ebp + var_offset]
这样就能原子修改一个数据
其中的lock会保证前端总线锁定,这样其他cpu核心不会修改这里,
而inc一个指令原子增,不会发生竞态问题
2014-8-29 12:25
0
游客
登录 | 注册 方可回帖
返回
//