none
windows程序设计,多线程的一个小问题! RRS feed

  • 问题

  • #include <stdio.h>
    #include <windows.h>
    
    DWORD WINAPI ThreadIdle(LPVOID lpParam)
    {
    	int i=0;
    	while(i++ < 10)
    	{
    		printf("Idle Thread is runing\n");
    	}
    	return 0;
    }
    
    DWORD WINAPI ThreadNormal(LPVOID lpParam)
    {
    	int i=0;
    	while(i++ < 10)
    	{
    		printf("Normal Thread is running\n");
    	}
    	return 0;
    }
    
    int main(int argc,char* argv[])
    {
    	DWORD dwThreadID;
    	HANDLE h[2];
    	//创建一个优先级为idle的线程
    	h[0] = ::CreateThread(NULL,0,ThreadIdle,NULL,
    								CREATE_SUSPENDED,&dwThreadID);
    	::SetThreadPriority(h[0],THREAD_PRIORITY_IDLE);
    	::ResumeThread(h[0]);
    
    	//创建一个优先级为Normal的线程
    	h[1] = ::CreateThread(NULL,0,ThreadNormal,NULL,0,&dwThreadID);
    
    	//等待两个线程内核对象都变成受信状态
    	::WaitForMultipleObjects(
    		2,	//DWORD nCount 要等待的内核对象的数量
    		h,	//CONST HANDLE *lpHandles句柄数组
    		TRUE,	//BOOL bWaitAll指定是否等待所有内核对象变成受信状态
    		INFINITE);	//DWORD dwMilliseconds要等待的时间
    
    	::CloseHandle(h[0]);
    	::CloseHandle(h[1]);
    	return 0;
    
    }
    这段代码的执行结果应该先输出 Normal Thread is runing 后输出Idle Thread is running 注意是一次输出10个,王艳平的《windows程序设计》中是这么说的,我第一次运行的时候也是这样,但是我运行了
    几次以后,发现不都是这样,有的是交叉输出的,请问这是为什么?
    2010年4月1日 12:14

答案

  • 虽然优先级,但如果你的电脑是多核,低优先级的线程在另外一个核空闲时是可能和高优先级的同时执行的。单核就是严格按优先级来了。


    0xBAADF00D
    2010年4月1日 14:56
    版主
  • 这个……

    这段代码的本意是,验证线程优先级,IDEL 优先级低于Normal。 Vonger 说得对,如果你现在的电脑是多核的,那么即使是IDEL级别的线程,也是可以得到同步执行的。 首先操作系统会分配Normal 级别线程进入CPU 运行,如果是两个甚至多个CPU内核,操作系统就不会让其它线程等待,会同时运行其它线程。这就会让IDEL 级别的线程更早的得到运行的集会。

    2010年4月1日 15:01
    版主

全部回复

  • 虽然优先级,但如果你的电脑是多核,低优先级的线程在另外一个核空闲时是可能和高优先级的同时执行的。单核就是严格按优先级来了。


    0xBAADF00D
    2010年4月1日 14:56
    版主
  • 这个……

    这段代码的本意是,验证线程优先级,IDEL 优先级低于Normal。 Vonger 说得对,如果你现在的电脑是多核的,那么即使是IDEL级别的线程,也是可以得到同步执行的。 首先操作系统会分配Normal 级别线程进入CPU 运行,如果是两个甚至多个CPU内核,操作系统就不会让其它线程等待,会同时运行其它线程。这就会让IDEL 级别的线程更早的得到运行的集会。

    2010年4月1日 15:01
    版主
  • 有相关的书籍吗?介绍一本给我,谢谢!
    2010年4月1日 15:04
  • 有一本高深的《Windows Internals》 翻译过来的叫做《深入解析Windows 操作系统》 那里面讲了线程的调度算法。 大部头,啃起来费劲,我的那本差点儿让我当了枕头……

     

    http://download.csdn.net/source/1805681

    2010年4月1日 15:13
    版主
  • 我建议你还是看这本书更加适合你目前的实际需要:

    《Win32 多线程程序设计》 侯捷译


    Mtrix,其实我很喜欢那样的生活~
    2010年4月2日 6:33