如何防止某一线程在执行过程中不会被切换?

kacy16 2010-12-12 05:44:15
各位兄弟姐妹,目前我碰到一个棘手的问题,就是在开发中的应用程序中同时有某几个线程在跑(各实现不同的功能),
但是在主线程中某个函数的功能是需要在运行时候不能时间上的延误,就是在运行某个功能时,系统把cpu的时间片给了另外的线程,当再系统再把cpu的控制权交回来的时,已经造成时间上的一些延误了,该函数极有可能会因为这个原因失败.为了避免这种情况,想问有没有什么方法可以要求在运行该个函数时不允许线程切换的发生?
...全文
1087 35 打赏 收藏 转发到动态 举报
写回复
用AI写文章
35 条回复
切换为时间正序
请发表友善的回复…
发表回复
kacy16 2011-09-09
  • 打赏
  • 举报
回复
非常谢谢各位的热心帮忙,让我对windows的调度机制有了更深入的了解.
至于该问题的解决,没有去改动上位机的程序了,线程调度是操作系统负责的,应用程序难以去精确的控制的。
请合作方改动了下位机的程序了,增加对接收数据的超时限制和完善了通信协议.
再次谢谢各位的帮忙!谢谢!
kacy16 2011-09-09
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 arong1234 的回复:]
我估计是他又想做多线程,又不做数据的并发保护,以单线程的思想作多线程

引用 8 楼 hankcs 的回复:
如果一定要不被调度,只有换一个实时的操作系统,Windows最高优先级的线程也有被调度走的时候
[/Quote]

谢谢arong1234兄的意见,并不是如你所推测的以单线程的思想在做多线程.
在此向各位说明一下这个问题发生的详细背景:
该应用程序是负责和一下位机设备进行通信驱动的,其中最主要的功能是向下位机设备发送上百K左右的数据,由于下位机的硬件资源所限制,不能一次全部发送,须每次10k左右的数据量一包共十来次发送,发送数据前,先发一个数据包头,说明该次发送的数据包的数量等.下位机设备是边接收包数据边进行数据处理,在这个过程中,偶尔会出现下位机设备报错信息的,报错的原因是接受不全数据包,表示下位机在一定时间内(几十毫秒级)的等不到一个数据包.所以我就首先怀疑是否上位机在循环10次数据包的过程中,中间系统切换到了跑另外一个线程,然后再切换回来发送剩下的几个包的数据,这时下位机由于等待的时间已经超过了设定的时间限值而报错了。
当然,这样的通信机制是否合理这又是另外一个问题。
safeqq2 2011-06-30
  • 打赏
  • 举报
回复
核心执行指令都会产生中断 比如 je jmp 等都会产生针对 这还不包括硬件中断 你想线程直接占用最高 那还不如把操作系统崩了算了
qinzhifang 2011-06-24
  • 打赏
  • 举报
回复
我觉得唯一办法就是28楼所讲的,将你的代码写成驱动并安装,在驱动中关中断,然后处理完后再开中断

这样的话,时钟中断产生的时间片就被屏蔽,也就在硬件级别禁止切换了,达到绝对禁止切换的目的

同时在你的代码里,绝对不能进行"系统调用",因为系统调用也会产生切换
bbbb5618 2010-12-19
  • 打赏
  • 举报
回复
学习一下
fly4free 2010-12-19
  • 打赏
  • 举报
回复
一定要记住一点,Windows不是实时的操作系统。
你不被自己的线程所干扰,也会有别的进程的线程去干扰。

除非你所说的影响是 自己定义的操作被自己定义的代码打断了,需要设计个同步机制。。。
周江涛 2010-12-18
  • 打赏
  • 举报
回复
楼主不妨详细说一下需求,一定有办法解决的,目前你的思路肯定是错误的.
csx007700 2010-12-17
  • 打赏
  • 举报
回复
lz。。。这个是可以实现的 关键要用到内核特权指令

你可以写一个驱动,把你要执行的代码放到R0下执行,执行前先asm CLI,完了asm STI就可以了。
herocxw2005 2010-12-16
  • 打赏
  • 举报
回复
要是能控制CPU一直给你的线程用,恐怕你中一个病毒啥的机器就OVER了
sanguomi 2010-12-15
  • 打赏
  • 举报
回复
应该是你设计上出问题了,
时间片的分配是由操作系统分配的
will_g 2010-12-15
  • 打赏
  • 举报
回复
这个没办法吧 时间片用完 就换了 系统调度的
libinfei8848 2010-12-15
  • 打赏
  • 举报
回复
要是在一个线程内部搞个死循环,就可以一直独占。。
renxu350 2010-12-15
  • 打赏
  • 举报
回复
线程同步问题,
用 CRITICAL_SECTION 或 EVENT,
WaitForSingleObject(),,,,,
libinfei8848 2010-12-15
  • 打赏
  • 举报
回复
估计你得换实时的操作系统了
sunlin7 2010-12-14
  • 打赏
  • 举报
回复
windows是多任务多线程系统,不允许独占(如果允许的话,那么windows的死机事件将遍地都是),所以没有办法实现楼主的“独占”欲望。

应该从设计上解决这个问题。比如使用缓冲,使用临界区域,使用消息等。

如果是想将多线程的进程暂时变成“单”线程的,可以使用加载dll的办法来实现。windows会保证进程第一次加载和真正卸载某个dll过程中,以DLL_PROCESS_ATTACH/DLL_PROCESS_DETACH进入DllMain的时候,系统中其它线程是被锁定不可调度的状态,利用这一点,可以在这个dll的DllMain函数中实现不被线程调度打断的任务。
bragi523 2010-12-14
  • 打赏
  • 举报
回复
看你的目的怎么样了
如果你要求绝对不被切换,除非最高权限,不可能,系统不允许


如果你只是要求不被相关线程切走,那就event等控制一下就可以了,(大部分我们的需求也就是这样的)
lmxmx 2010-12-14
  • 打赏
  • 举报
回复
……
建议LZ使用DOS系统,绝对符合你的要求……

在Windows里,不切换线程可能吗?如果将CPU时间全部给你的线程,操作系统还不立刻给你个脸色看?
teleinfor 2010-12-14
  • 打赏
  • 举报
回复
这个比较难吧!!!
hzy694358 2010-12-13
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 arong1234 的回复:]

我估计是他又想做多线程,又不做数据的并发保护,以单线程的思想作多线程引用 8 楼 hankcs 的回复:
如果一定要不被调度,只有换一个实时的操作系统,Windows最高优先级的线程也有被调度走的时候
[/Quote]

呵呵,看起来是挺像的
不知道楼主是不是没做线程同步处理
如果不是这个问题,我觉得,既然是因为你程序的线程导致的,
那么将主线程才优先级设置成高于你程序中的其他线程应该就可以了
Eleven 2010-12-13
  • 打赏
  • 举报
回复
线程的调度是系统内核来管理的,应用程序做不到
加载更多回复(15)

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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