我们都知道线程的执行是没有顺序的,比如下面的例子,有三个线程,分别输出Hello word! I am sleeping! Please wait... I am awake ,如果我们不加控制,那么运行出来的结果可能是 I am sleeping! Hello word! Please wait... I am awake或者其他的情况。那么下面就讲一下怎么让其按照指定的顺序执行。
当一个线程被创建,它的“线程相对优先级”默认为normal(标准)。CreateThread函数没有提供设置线 程相对优先级的功能。可以调用SetThreadPriority函数设置一个线程的相对优先级。
BOOL SetThreadPriority(HANDLE hThread, nt nPriority); //指定的线程句柄 //线程相对优先级
(取值对应如下)
该函数接受一个线程句柄和线程相对优先级取值,设置对应的线程的相对优先级。该线程相对优先级取值如下:
1、THREAD_PRIORITY_TIME_CRITICAL:Time-critical,关键时间(最高)
2、THREAD_PRIORITY_HIGHEST:Highest,最高(其实是“次高”)
3、THREAD_PRIORITY_ABOVE_NORMAL:Above normal,高于标准
4、THREAD_PRIORITY_NORMAL:Normal,标准
5、THREAD_PRIORITY_BELOW_NORMAL:Below normal,低于标准
6、THREAD_PRIORITY_LOWEST:Lowest,最低(其实是“次低”)
7、THREAD_PRIORITY_IDLE:Idle,空闲(最低)
你可以呼叫GetTreadPriotiry函数取得一个特定线程的相对优先级。
int GetThreadPriority(HANDLE hThread); //函数返回上述7个取值
为了创建一个线程相对优先级不是标准的线程,比如要创建一个高于标准的线程,你可以传递CREATE_SUSPENDED参数给CreateThread,从而创建一个起始状态为“挂起”的线程,然后调用SetThreadPriority函数设置该线程的相对优先级,然后调用ResumeThread函数恢复该线程的运行。代码如下:
DWORD dwThreadID;
HANDLE hThread =CreateThread(NULL, 0, ThreadFunc, NULL,CREATE_SUSPENDED, &dwThreadID);
SetThreadPriority(hThread, THREAD_PRIORITY_ABOVE_NORMAL);
ResumeThread(hThread);
CloseHandle(hThread);
操作系统会动态地提高线程的基础优先级等级(0~31),一般是为了响应一些I/O事件。
不理解的话,运行一下下面的程序:
// ThreadCreate.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "ThreadCreate.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/
// The one and only application object
CWinApp theApp;
using namespace std;
void ThreadName1();
void ThreadName2();
void ThreadName3();
static HANDLE hHandle1=NULL;
static HANDLE hHandle2=NULL;
static HANDLE hHandle3=NULL;
DWORD dwThreadID1;
DWORD dwThreadID2;
DWORD dwThreadID3;
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;
hHandle1=CreateThread((LPSECURITY_ATTRIBUTES)NULL,0,(LPTHREAD_START_ROUTINE)ThreadName1,(LPVOID)NULL,0,&dwThreadID1);
SetThreadPriority(hHandle1,THREAD_PRIORITY_HIGHEST);
CloseHandle(hHandle1);
hHandle2=CreateThread((LPSECURITY_ATTRIBUTES)NULL,0,(LPTHREAD_START_ROUTINE)ThreadName2,(LPVOID)NULL,0,&dwThreadID2);
SetThreadPriority(hHandle2,THREAD_PRIORITY_NORMAL);
CloseHandle(hHandle2);
hHandle3=CreateThread((LPSECURITY_ATTRIBUTES)NULL,0,(LPTHREAD_START_ROUTINE)ThreadName3,(LPVOID)NULL,0,&dwThreadID3);
SetThreadPriority(hHandle3,THREAD_PRIORITY_BELOW_NORMAL);
CloseHandle(hHandle3);
ExitThread(0);
return nRetCode;
}
void ThreadName1()
{
printf("Hello word!\n");
}
void ThreadName2()
{
printf("I am sleeping!\n");
}
void ThreadName3()
{
printf("Please wait...\n");
Sleep(1000);
printf("I am awake");
}
//怎么让其有顺序地执行,用SetThreadPriority(HANDLE ,优先级)