社区
进程/线程/DLL
帖子详情
如何防止某一线程在执行过程中不会被切换?
kacy16
2010-12-12 05:44:15
各位兄弟姐妹,目前我碰到一个棘手的问题,就是在开发中的应用程序中同时有某几个线程在跑(各实现不同的功能),
但是在主线程中某个函数的功能是需要在运行时候不能时间上的延误,就是在运行某个功能时,系统把cpu的时间片给了另外的线程,当再系统再把cpu的控制权交回来的时,已经造成时间上的一些延误了,该函数极有可能会因为这个原因失败.为了避免这种情况,想问有没有什么方法可以要求在运行该个函数时不允许线程切换的发生?
...全文
1087
35
打赏
收藏
如何防止某一线程在执行过程中不会被切换?
各位兄弟姐妹,目前我碰到一个棘手的问题,就是在开发中的应用程序中同时有某几个线程在跑(各实现不同的功能), 但是在主线程中某个函数的功能是需要在运行时候不能时间上的延误,就是在运行某个功能时,系统把cpu的时间片给了另外的线程,当再系统再把cpu的控制权交回来的时,已经造成时间上的一些延误了,该函数极有可能会因为这个原因失败.为了避免这种情况,想问有没有什么方法可以要求在运行该个函数时不允许线程切换的发生?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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)
什么是
线程
的上下文
切换
多
线程
的上下文
切换
:是...CPU为了能够
执行
多个
线程
,需要不停的
切换
执行
的
线程
,这样才能使所有
线程
在一段时间内都有被
执行
的机会。CPU通过时间片分配算法来循环
执行
任务,当前任务
执行
一个时间片后
切换
到下一个任务。
线程
上下文
切换
一、为什么要减少
线程
上下文
切换
当CPU从
执行
一个
线程
切换
到
执行
另外一个
线程
的时候,它需要先存储当前
线程
的本地...CPU会在一个上下文
中
执行
一个
线程
,然后
切换
到另外一个上下文
中
执行
另外一个
线程
。上下文
切换
并...
JUC多
线程
:系统调用、进程、
线程
的上下文
切换
1、上下文
切换
就是一个
线程
释放处理器的使用权,...2、在 JDK 的 java.lang.Thread.State 源码
中
定义了6个状态,在
某一
时刻,一个
线程
只能处于一种状态:New、Runnable、Blocked、Waiting、Timed Waiting、Terminated
关于
线程
上下文
切换
,你知道多少?
由于现在大多计算机都是多核CPU,多
线程
往往会比单
线程
更快,更能够提高并发,但提高并发并不意味着启动更多的
线程
来
执行
。更多的
线程
意味着
线程
创建销毁开销加大、上下文非常频繁,你的程序反而...
线程
上下文是指
某一
多
线程
(一):创建
线程
和
线程
的常用方法
了解并发编程:实际工作
中
很少写多
线程
的代码,这部分代码一般都被人封装起来了,在业务
中
使用多
线程
的机会也不是很多(看具体项目),但是作为一个高级程序员如果
不会
多
线程
是说不过去的。 二:进程与
线程
...
进程/线程/DLL
15,471
社区成员
49,182
社区内容
发帖
与我相关
我的任务
进程/线程/DLL
VC/MFC 进程/线程/DLL
复制链接
扫一扫
分享
社区描述
VC/MFC 进程/线程/DLL
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章