创建线程CreateThread
线程创建函数CreateThread
修改说明:
CreateThread()l来创建线程其实是一种不太好的方法,在实际使用中尽量使用_beginthreade()来创建线程,因为更加的安全
函数的原型:
HANDLE WINAPI CreateThread(
_In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes,
_In_ SIZE_T dwStackSize,
_In_ LPTHREAD_START_ROUTINE lpStartAddress,
_In_opt_ LPVOID lpParameter,
_In_ DWORD dwCreationFlags,
_Out_opt_ LPDWORD lpThreadId
);
参数说明:
第一个参数 lpThreadAttributes 表示线程内核对象的安全属性,一般传入NULL表示使用默认设置。
第二个参数 dwStackSize 表示线程栈空间大小。传入0表示使用默认大小(1MB)。
第三个参数 lpStartAddress 表示新线程所执行的线程函数地址,多个线程可以使用同一个函数地址。
第四个参数 lpParameter 是传给线程函数的参数。
第五个参数 dwCreationFlags 指定额外的标志来控制线程的创建,为0表示线程创建之后立即就可以进行调度,如果为CREATE_SUSPENDED则表示线程创建后暂停运行,这样它就无法调度,直到调用ResumeThread()。
第六个参数 lpThreadId 将返回线程的ID号,传入NULL表示不需要返回该线程ID号。
返回值
CreateThread的返回值是线程的句柄,失败的话就返回NULL
SuspendThread()
用于挂起指定线程。原型为DQORD SuspendThread(HANDLE hThread)
每调用一次,由hThread标识的线程的挂起状态计数值加1。若函数执行成功,返回hThread标识的线程的挂起状态计数值。
Windows API 中的SetThreadPriority()
我们都知道线程的执行是没有顺序的,比如下面的例子,有三个线程,分别输出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函数恢复该线程的运行。