发新帖我要提问
123
返回列表
打印

从windows多线程编程想到一个问题,请大侠帮忙分析?

[复制链接]
楼主: okay007
手机看帖
扫描二维码
随时随地手机跟帖
41
okay007|  楼主 | 2010-12-29 20:28 | 只看该作者 回帖奖励 |倒序浏览
本帖最后由 okay007 于 2010-12-29 21:15 编辑

谢谢楼上,不好意思,是我没理解你的意思,35楼的伪代码我没有试,但是感觉应该可以解决我说的问题!
还有个疑问不知对否?就是用你的方法,进入中断后如果检测是非开锁状态就会什么也不做退出,那本次中断就会无效,在某些情况下可能不太好!不知是否这样?
谢谢“前辈”了!
(回完帖子后,看到楼上把这个问题说明了,我觉得除了有这个问题你的方法还是不错的,谢谢你的回答,之前真的不知道互斥锁可以这样用。)

使用特权

评论回复
42
ahr| | 2010-12-29 22:42 | 只看该作者
关中断可行,但是效率不好,还容易丢触发信息。
所以中断开始的时候先保护用到的寄存器,中断返回前再恢复啊。
我对你贴的汇编不熟,猜想开头ST两句是把R16和R17压栈,后面的LD是恢复R16,R17原来的数据。这样中断退出后,仍然不会影响到普通模式下寄存器的应用。
至于原子操作,我的理解是操作数的位数不大于cpu字长就可以了吧,不然处理了到一半,另一个线程又来处理,这样会导致计算不计算不正确,这个时候需要加锁。
比如8位的cpu处理16位的数据:
short int a;
线程1:
a = 0x1111; // 这时候分2步,一次一个字节
线程2:
a = 0x2222;

不锁定的话,有可能使a变为 0x1122,或0x2211

使用特权

评论回复
43
刘前辈| | 2010-12-30 09:26 | 只看该作者
还有个疑问不知对否?就是用你的方法,进入中断后如果检测是非开锁状态就会什么也不做退出,那本次中断就会无效,在某些情况下可能不太好!不知是否这样?
   


确实有这个问题,中断程序是不能等待开锁的;这样看来,关中断推迟等待开锁也有好处。不过,还是如42楼所说,应该在中断程序中先检测锁状态:如果检测到锁关闭,ISR 知道后台也在处理count,那么就采用另外的与开锁状态不同的处理方法。——简单又完善了。

      if(_testbit( 锁 )_ )
       {  闭锁处理 }
         else   {开锁处理 };

使用特权

评论回复
44
bald| | 2010-12-30 14:28 | 只看该作者
这里涉及到的竞争问题许多地方都会遇到。
应避免不同线程对同一变量进行操作。
这个问题可以这样解决:
1、两个线程分别使用不同的计数器。
2、主线程对另一个线程的计数器做一个映像(似乎备份更确切一些)
3、主线程在调整计数器时检查备份和另一个计数器是否相同,如果不同则在调整主计数器的同时加上增量并更新备份计数器。
4、如果另一线程使用该计数器做控制变量,使用主计数器的值。

使用特权

评论回复
45
流行音乐| | 2011-5-11 23:17 | 只看该作者
这么好的论题怎么能不顶。大家接着讨论。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则