将主线程优先级设置最高,其它线程设置最低,其它线程能获得CPU时间吗

时间:2021-03-27 21:13:56
将主线程优先级设置最高,其它线程设置最低,其它线程能获得CPU时间吗,本人写了一个程序,得出的结论是,其他线程能获得CPU时间,按道理,在所写测试程序中,主线程永远获得CPU时间,其他线程无机会获得,程序应该不能退出,但是实际的却不是这样的,所以很困惑,不知道为什么不是我想的这样的,请高手指导呀,代码如下:
#include <windows.h>
#include <iostream>
using namespace std;


DWORD WINAPI ThreadFun( LPVOID lParam )
{
UNREFERENCED_PARAMETER( lParam );
for ( int i = 0; i < 10; ++i )
{
cout << "线程运行中..." << endl;
}
return 0;
}


int main()
{
//设置主线程优先级最高
HANDLE hPrimaryThread = GetCurrentThread();
SetThreadPriority( hPrimaryThread, THREAD_PRIORITY_HIGHEST );

HANDLE hThrd;
DWORD dwThrdID;
hThrd = CreateThread( NULL, 0, ThreadFun, NULL, CREATE_SUSPENDED, &dwThrdID );
//设置线程优先级为空闲
SetThreadPriority( hThrd, THREAD_PRIORITY_IDLE );
ResumeThread( hThrd );


WaitForSingleObject( hThrd, INFINITE );
CloseHandle( hThrd );

return 0;
}

7 个解决方案

#1


The system uses the base priority level of all executable threads to determine which thread gets the next slice of CPU time.
优先级高的线程可以获得优先调度过,调度以时间片为单位。 不是说优先级高的线程运行完了才能调度优先级低的线程。

在2-CPU的电脑,2个线程都可以并行. 

#2


window的线程是按时间片运行的。优先级高的先运行,但是等级再高,时间片也是一定的,时间片用完了,自然会运行等级低的。不存在等级低的就不能运行的情况。

你是不是学习其它的线程调试算法搞混了

#3


引用 2 楼 lovesmiles 的回复:
window的线程是按时间片运行的。优先级高的先运行,但是等级再高,时间片也是一定的,时间片用完了,自然会运行等级低的。不存在等级低的就不能运行的情况。

你是不是学习其它的线程调试算法搞混了


时间片用完了,操作系统调度不是选择优先级高的吗,那优先高的那个线程在时间片用完之后,并没有执行完,并且优先级不变,那么下一轮调度还是优先调度呀,是不是这样呢,帮我详细解释解释,谢谢你了

#4


引用 1 楼 mujiok2003 的回复:
The system uses the base priority level of all executable threads to determine which thread gets the next slice of CPU time.
优先级高的线程可以获得优先调度过,调度以时间片为单位。 不是说优先级高的线程运行完了才能调度优先级低的线程。

在2-CPU的电脑,2个线程都可以并行. 


是优先调度呀,优先级高的线程并没有执行完成,所以下一轮不是也会优先获得调度吗,是不是调度过一次,他的优先级就会被操作系统减少一些呢,或者是其它的解释,谢谢你的热心帮忙哈

#5


引用 4 楼 s634772208 的回复:
Quote: 引用 1 楼 mujiok2003 的回复:

The system uses the base priority level of all executable threads to determine which thread gets the next slice of CPU time.
优先级高的线程可以获得优先调度过,调度以时间片为单位。 不是说优先级高的线程运行完了才能调度优先级低的线程。

在2-CPU的电脑,2个线程都可以并行. 


是优先调度呀,优先级高的线程并没有执行完成,所以下一轮不是也会优先获得调度吗,是不是调度过一次,他的优先级就会被操作系统减少一些呢,或者是其它的解释,谢谢你的热心帮忙哈


我觉得  动态优先级 差不多你这个意思吧
反正 优先级低的肯定不会被饿死了

但是  实时优先级 还是要谨慎使用。

#6


引用 4 楼 s634772208 的回复:
Quote: 引用 1 楼 mujiok2003 的回复:

The system uses the base priority level of all executable threads to determine which thread gets the next slice of CPU time.
优先级高的线程可以获得优先调度过,调度以时间片为单位。 不是说优先级高的线程运行完了才能调度优先级低的线程。

在2-CPU的电脑,2个线程都可以并行. 


是优先调度呀,优先级高的线程并没有执行完成,所以下一轮不是也会优先获得调度吗,是不是调度过一次,他的优先级就会被操作系统减少一些呢,或者是其它的解释,谢谢你的热心帮忙哈

会有一些动态补偿或调整, 让低优先级的线程也有机会运行。 

#7


如果想自己明确调度顺序用协程或子例程。

#1


The system uses the base priority level of all executable threads to determine which thread gets the next slice of CPU time.
优先级高的线程可以获得优先调度过,调度以时间片为单位。 不是说优先级高的线程运行完了才能调度优先级低的线程。

在2-CPU的电脑,2个线程都可以并行. 

#2


window的线程是按时间片运行的。优先级高的先运行,但是等级再高,时间片也是一定的,时间片用完了,自然会运行等级低的。不存在等级低的就不能运行的情况。

你是不是学习其它的线程调试算法搞混了

#3


引用 2 楼 lovesmiles 的回复:
window的线程是按时间片运行的。优先级高的先运行,但是等级再高,时间片也是一定的,时间片用完了,自然会运行等级低的。不存在等级低的就不能运行的情况。

你是不是学习其它的线程调试算法搞混了


时间片用完了,操作系统调度不是选择优先级高的吗,那优先高的那个线程在时间片用完之后,并没有执行完,并且优先级不变,那么下一轮调度还是优先调度呀,是不是这样呢,帮我详细解释解释,谢谢你了

#4


引用 1 楼 mujiok2003 的回复:
The system uses the base priority level of all executable threads to determine which thread gets the next slice of CPU time.
优先级高的线程可以获得优先调度过,调度以时间片为单位。 不是说优先级高的线程运行完了才能调度优先级低的线程。

在2-CPU的电脑,2个线程都可以并行. 


是优先调度呀,优先级高的线程并没有执行完成,所以下一轮不是也会优先获得调度吗,是不是调度过一次,他的优先级就会被操作系统减少一些呢,或者是其它的解释,谢谢你的热心帮忙哈

#5


引用 4 楼 s634772208 的回复:
Quote: 引用 1 楼 mujiok2003 的回复:

The system uses the base priority level of all executable threads to determine which thread gets the next slice of CPU time.
优先级高的线程可以获得优先调度过,调度以时间片为单位。 不是说优先级高的线程运行完了才能调度优先级低的线程。

在2-CPU的电脑,2个线程都可以并行. 


是优先调度呀,优先级高的线程并没有执行完成,所以下一轮不是也会优先获得调度吗,是不是调度过一次,他的优先级就会被操作系统减少一些呢,或者是其它的解释,谢谢你的热心帮忙哈


我觉得  动态优先级 差不多你这个意思吧
反正 优先级低的肯定不会被饿死了

但是  实时优先级 还是要谨慎使用。

#6


引用 4 楼 s634772208 的回复:
Quote: 引用 1 楼 mujiok2003 的回复:

The system uses the base priority level of all executable threads to determine which thread gets the next slice of CPU time.
优先级高的线程可以获得优先调度过,调度以时间片为单位。 不是说优先级高的线程运行完了才能调度优先级低的线程。

在2-CPU的电脑,2个线程都可以并行. 


是优先调度呀,优先级高的线程并没有执行完成,所以下一轮不是也会优先获得调度吗,是不是调度过一次,他的优先级就会被操作系统减少一些呢,或者是其它的解释,谢谢你的热心帮忙哈

会有一些动态补偿或调整, 让低优先级的线程也有机会运行。 

#7


如果想自己明确调度顺序用协程或子例程。