假如两个任务共享一个32位的整数变量,一个任务给这个变量加1,另一个任务给这个变量清0。那需要保护吗?

soarhigh 2004-04-16 09:10:30
有一段话说得好:
信号量常被用过了头。处理简单的共享变量也使用信号量则是多余的。请求和释放信号量的过程是要花相当的时间的。有时这种额外的负荷是不必要的。用户可能只需要关中断、开中断来处理简单共享变量,以提高效率。假如两个任务共享一个32位的整数变量,一个任务给这个变量加1,另一个任务给这个变量清0。如果注意到不管哪种操作,对微处理器来说,只花极短的时间,就不会使用信号量来满足互斥条件了。每个任务只需操作这个任务前关中断,之后再开中断就可以了。然而,如果这个变量是浮点数,而相应微处理器又没有硬件的浮点协处理器,浮点运算的时间相当长,关中断时间长了会影响中断延迟时间,这种情况下就有必要使用信号量了。

请问,只有一个cpu,既便一个任务给这个变量加1,另一个任务给这个变量清0。那也不会同时操作,为什么还需要保护?
...全文
78 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
shan_ghost 2004-04-16
  • 打赏
  • 举报
回复
实际中不可能就是给变量加一清零玩吧?这个变量一定是有用的!

假如A发现某条件合适就给变量加一,B则在变量大于一时做某件事并清零该变量--这应该是最简单的逻辑了--那么,当b发现变量大于1时在本地做一个标记以便在下面程序中做某事,然后中断发生,a给变量又加一了--然后回到b清零该变量:b会少做一次变量为一时的操作!
w3guy 2004-04-16
  • 打赏
  • 举报
回复
CPU 处理把变量A加1
1. A -> 寄存器
2. 寄存器 + 1 -> 寄存器
3. 寄存器-> A

CPU 处理把变量A清零
a. 0 -> 寄存器
b. 寄存器-> A

当线程一进行到2 时,线程二开始运行,把A 清0, 线程一进行到3 又把A 改成了1

soarhigh 2004-04-16
  • 打赏
  • 举报
回复
“如果可能在两个不同线程中运行这两个任务的话,还是需要保护的。”
为什么,只有一个cpu,任务A给变量加1时,任务B不可能给这个变量清0。为何还要保护?
zhouqingyuan 2004-04-16
  • 打赏
  • 举报
回复
如果可能在两个不同线程中运行这两个任务的话,还是需要保护的。
w3guy 2004-04-16
  • 打赏
  • 举报
回复
》每个任务只需操作这个任务前关中断,之后再开中断就可以了
在用户模式下,你有权限控制操作系统关于任务调度的中断吗?

64,647

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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