多线程中线程之间如何时间主动切换?

时间:2023-01-25 21:19:58
1 Sleep(0)
2 SwitchToThread()

还有别的办法么?

现在我做的是在RTSS环境下做的,SwitchToThread()不能用,而且据说Sleep()不准,很不稳定

21 个解决方案

#1


SwitchToThread是给纤程用的吧,参考<windows核心编程〉

Sleep(0)就是放弃时间片,放弃后怎么调度依赖于操作系统当时的情况。

#2


是啊,我在主线程里建立了两个线程,每个线程函数里都有Sleep(0),希望在两个线程间不断切换,但有时Sleep(0)后,根据输出的调试结果看并没有切换到另一个线程,不知道怎么回事

#3


操作系统调度的问题,
具体调度情况依据操作系统进行调度。
sleep(0)只是放弃线程的时间片

#4


sigh,ok.还是要多看书

#5


多任务系统时间是很难准的,想准几乎不可能。而且,你是没有办法代替OS去调度线程的,Sleep也不可能强制切换到你自己的另外一个线程

#6


又要用多线程,又要切换?真看不懂是什么意思。既然不是并行,那为什么要用多线程?纤程(Fiber)不行么?

#7


另外如果确实就只是为了在线程之间进行切换,那就使用多媒体定时器吧。

#8


为什么需要主动相互切换??

你需要他们之间交互的话 线程间通信的方式也很多了。

#9


用两个信号量就可以了

A :             B:  
while(1){        while(1){
 Lock BB         Lock AA
 Free AA         Free BB
}               }

#10


为了测试实时系统的线程转换时间。我只能想到这个办法了,呵呵。

#11


安装了RTX系统,利用VC里的RTX APPLICATION WIZARD建立的框架。Fiber我不懂啊

#12


你可以用九楼的方法试一下,用Criticalsection,让两个线程走走停停,不知道能不能解决你的问题

#13


都是很好的建议! 值得学习

#14


接分先!

#15


线程:
1.时间片:时钟中断处理例程从PCR中取得当前线程对象指针并更新线程时间,如果超出了时间片,则将当前线程从放入ready列表中,然后从standby列表中取出最高优先级的线程,然后保存当前线程上下文数据,并转到新的线程上下文.

2.主动等待:线程调用等待函数,则将当前线程放到wait列表中,然后从standby列表中取一个线程,切换上下文,当主动等待的事件完成时,线程被调度到ready列表中等待再次被调度运行.

3.抢先:时钟中断发现standby列表中有比当前线程更高的线程,则挂起当前线程,切换线程上下文,运行最需要运行的线程.

所以,线程间切换就是"线程挂起自己,让出CPU"

#16


操作系统的事,Win32位下应该没有主动切换一说,除非用Sleep或是WaitForSingleObject阻塞自己

#17


mark

#18


mark 多线程中线程之间如何时间主动切换?

#19


要控制先后顺序,必须要用信号量呀

#20


告诉你一个好办法 别跟别人说 用EDF算法 就可以 我感觉很不错的

#21


mark
学习了

#1


SwitchToThread是给纤程用的吧,参考<windows核心编程〉

Sleep(0)就是放弃时间片,放弃后怎么调度依赖于操作系统当时的情况。

#2


是啊,我在主线程里建立了两个线程,每个线程函数里都有Sleep(0),希望在两个线程间不断切换,但有时Sleep(0)后,根据输出的调试结果看并没有切换到另一个线程,不知道怎么回事

#3


操作系统调度的问题,
具体调度情况依据操作系统进行调度。
sleep(0)只是放弃线程的时间片

#4


sigh,ok.还是要多看书

#5


多任务系统时间是很难准的,想准几乎不可能。而且,你是没有办法代替OS去调度线程的,Sleep也不可能强制切换到你自己的另外一个线程

#6


又要用多线程,又要切换?真看不懂是什么意思。既然不是并行,那为什么要用多线程?纤程(Fiber)不行么?

#7


另外如果确实就只是为了在线程之间进行切换,那就使用多媒体定时器吧。

#8


为什么需要主动相互切换??

你需要他们之间交互的话 线程间通信的方式也很多了。

#9


用两个信号量就可以了

A :             B:  
while(1){        while(1){
 Lock BB         Lock AA
 Free AA         Free BB
}               }

#10


为了测试实时系统的线程转换时间。我只能想到这个办法了,呵呵。

#11


安装了RTX系统,利用VC里的RTX APPLICATION WIZARD建立的框架。Fiber我不懂啊

#12


你可以用九楼的方法试一下,用Criticalsection,让两个线程走走停停,不知道能不能解决你的问题

#13


都是很好的建议! 值得学习

#14


接分先!

#15


线程:
1.时间片:时钟中断处理例程从PCR中取得当前线程对象指针并更新线程时间,如果超出了时间片,则将当前线程从放入ready列表中,然后从standby列表中取出最高优先级的线程,然后保存当前线程上下文数据,并转到新的线程上下文.

2.主动等待:线程调用等待函数,则将当前线程放到wait列表中,然后从standby列表中取一个线程,切换上下文,当主动等待的事件完成时,线程被调度到ready列表中等待再次被调度运行.

3.抢先:时钟中断发现standby列表中有比当前线程更高的线程,则挂起当前线程,切换线程上下文,运行最需要运行的线程.

所以,线程间切换就是"线程挂起自己,让出CPU"

#16


操作系统的事,Win32位下应该没有主动切换一说,除非用Sleep或是WaitForSingleObject阻塞自己

#17


mark

#18


mark 多线程中线程之间如何时间主动切换?

#19


要控制先后顺序,必须要用信号量呀

#20


告诉你一个好办法 别跟别人说 用EDF算法 就可以 我感觉很不错的

#21


mark
学习了