VS C++ 线程篇之三设置优先级

设置线程优先级

BOOL WINAPI SetThreadPriority(
  __in HANDLE hThread,
  __in int nPriority
);

参数nPriority的值

THREAD_MODE_BACKGROUND_BEGIN
0x00010000
 
THREAD_MODE_BACKGROUND_END
0x00020000
 
THREAD_PRIORITY_ABOVE_NORMAL 
1
高于正常
THREAD_PRIORITY_BELOW_NORMAL 
-1
低于正常
THREAD_PRIORITY_HIGHEST
2
最高
THREAD_PRIORITY_IDLE 
-15
空闲
THREAD_PRIORITY_LOWEST 
-2
最低
THREAD_PRIORITY_NORMAL 
0
正常
THREAD_PRIORITY_TIME_CRITICAL
15
实时

调度方式

    高优先级优先调度,同优先级机会均等。

    低优先级线程也会执行的,由系统决定。

创建线程时函数中如何设置

HANDLE WINAPI CreateThread(
  LPSECURITY_ATTRIBUTES lpThreadAttributes,
  SIZE_T dwStackSize,
  LPTHREAD_START_ROUTINE lpStartAddress,
  LPVOID lpParameter,
  DWORD dwCreationFlags,	// CREATE_SUSPENDED 线程被创建后挂起,直到 ResumeThread 函数被调用才运行。
				// 0 线程创建后立即运行。
  LPDWORD lpThreadId
);

DWORD WINAPI ResumeThread(
  HANDLE hThread
);

例程1:默认优先级执行

#include 
#include 
#include 

DWORD WINAPI ThreadProFuncA(LPVOID lpParam);
DWORD WINAPI ThreadProFuncB(LPVOID lpParam);
int main(int argc, char **argv)
{
	HANDLE hThreadA;
	HANDLE hThreadB;
	DWORD dwThreadIdA;
	DWORD dwThreadIdB;
	
	hThreadA = CreateThread( NULL	// 默认安全属性
						, NULL		// 默认堆栈大小
						, ThreadProFuncA // 线程入口地址
						, NULL	//传递给线程函数的参数
						, 0	// 创建完线程立即执行
						, &dwThreadIdA	//线程ID号
						);
	CloseHandle(hThreadA);	// 关闭线程句柄

	hThreadB = CreateThread( NULL, NULL, ThreadProFuncB, NULL, 0, &dwThreadIdB);
	CloseHandle(hThreadB);	// 关闭线程句柄

	system("pause");
	return 0;
}

DWORD WINAPI ThreadProFuncA(LPVOID lpParam)
{
	for(int i = 0; i < 5; i++) {
		printf("hello\n");
	}
	return 0;
}

DWORD WINAPI ThreadProFuncB(LPVOID lpParam)
{
	for(int i = 0; i < 5; i++) {
		printf("world\n");
	}
	return 0;
}

运行结果

hello
hello
hello
hello
world
hello
world
world
world
world
请按任意键继续. . .

例程2:创建完线程,通过 ResumeThread  执行指定线程,这里创建完线程不执行

#include 
#include 
#include 

DWORD WINAPI ThreadProFuncA(LPVOID lpParam);
DWORD WINAPI ThreadProFuncB(LPVOID lpParam);
int main(int argc, char **argv)
{
	HANDLE hThreadA;
	HANDLE hThreadB;
	DWORD dwThreadIdA;
	DWORD dwThreadIdB;
	
	hThreadA = CreateThread( NULL	// 默认安全属性
						, NULL		// 默认堆栈大小
						, ThreadProFuncA // 线程入口地址
						, NULL	//传递给线程函数的参数
						, CREATE_SUSPENDED 	// 线程创建后挂起,直到调用 ResumeThread 运行
						, &dwThreadIdA	//线程ID号
						);
	CloseHandle(hThreadA);	// 关闭线程句柄

	hThreadB = CreateThread( NULL, NULL, ThreadProFuncB, NULL, 0, &dwThreadIdB);
	CloseHandle(hThreadB);	// 关闭线程句柄

	system("pause");
	return 0;
}

DWORD WINAPI ThreadProFuncA(LPVOID lpParam)
{
	for(int i = 0; i < 5; i++) {
		printf("hello\n");
	}
	return 0;
}

DWORD WINAPI ThreadProFuncB(LPVOID lpParam)
{
	for(int i = 0; i < 5; i++) {
		printf("world\n");
	}
	return 0;
}

运行结果

world
world
world
world
world
请按任意键继续. . .
例程3:设置优先级
#include 
#include 
#include 

DWORD WINAPI ThreadProFuncA(LPVOID lpParam);
DWORD WINAPI ThreadProFuncB(LPVOID lpParam);
int main(int argc, char **argv)
{
	HANDLE hThreadA;
	HANDLE hThreadB;
	DWORD dwThreadIdA;
	DWORD dwThreadIdB;
	
	hThreadA = CreateThread( NULL	// 默认安全属性
				, NULL		// 默认堆栈大小
				, ThreadProFuncA // 线程入口地址
				, NULL	//传递给线程函数的参数
				, CREATE_SUSPENDED 	// 线程创建后挂起,直到调用 ResumeThread 运行
				, &dwThreadIdA	//线程ID号
				);
	
	SetThreadPriority(hThreadA, THREAD_PRIORITY_LOWEST);	// 设置线程A优先级最低
	ResumeThread(hThreadA);	// 线程A执行
	CloseHandle(hThreadA);	// 关闭线程句柄

	hThreadB = CreateThread( NULL, NULL, ThreadProFuncB, NULL, 0, &dwThreadIdB);
	CloseHandle(hThreadB);	// 关闭线程句柄

	system("pause");
	return 0;
}

DWORD WINAPI ThreadProFuncA(LPVOID lpParam)
{
	for(int i = 0; i < 5; i++) {
		printf("hello\n");
	}
	return 0;
}

DWORD WINAPI ThreadProFuncB(LPVOID lpParam)
{
	for(int i = 0; i < 5; i++) {
		printf("world\n");
	}
	return 0;
}

运行结果

hello
hello
hello
world
hello
hello
world
world
world
world
请按任意键继续. . .

你可能感兴趣的:(VS)