05 线程

1.线程概念
线程是附属在进程上的执行实体,是代码的执行流程;
一个进程可以包含多个线程,但一个进程至少要包含一个线程;
单核不存在真正的多线程,每个时间段只有一段代码在运行,这时的多线程就是并发;多核才存在真正的多线程,这时的多线程是并行的;所以讲Win8设置核心数为自己电脑CPU核心数能提升电脑速度(并行);
线程被清理的两个必要条件,线程的引用计数为0,线程的代码执行完毕;

2.简单线程串创建代码

/**
*CreateThread.c
*/
#include <stdio.h>
#include <windows.h>

//线程处理函数,参数与返回值不是必须的;
DWORD WINAPI ThreadProc(LPVOID lpThreadParameter)
{
	INT *p = (INT*)lpThreadParameter;
	for (INT i = 0; i < *p; i++){
		Sleep(500);
		printf("+++++++++++++%d\n", i);
	}
	return 0;
}

int main()
{
	HANDLE hThread;
	INT n = 10;
	hThread = CreateThread(NULL, 0, ThreadProc, &n, 0, NULL);
	for (INT i = 0; i < 100; i++){
		Sleep(500);
		printf("--------------%d\n", i);
	}
	return 0;
}
  1. 线程的挂起与释放API演示
/**
*CreateThread.c
*/
#include <stdio.h>
#include <windows.h>

//线程处理函数,参数与返回值不是必须的;
DWORD WINAPI ThreadProc(LPVOID lpThreadParameter)
{
	INT *p = (INT*)lpThreadParameter;
	for (INT i = 0; i < *p; i++){
		Sleep(500);
		printf("+++++++++++++%d\n", i);
	}
	return 0;
}

int main()
{
	HANDLE hThread;
	INT n = 10;
	hThread = CreateThread(NULL, 0, ThreadProc, &n, 0, NULL);
	Sleep(5000);
	//挂起线程,一个线程可以挂起多次,但是挂起几次就要恢复几次
	SuspendThread(hThread);
	Sleep(5000);
	//从挂起状态恢复
	ResumeThread(hThread);
	CloseHandle(hThread);

	getchar();
	return 0;
}

4.等待线程API函数演示

/**
*CreateThread.c
*/
#include <stdio.h>
#include <windows.h>

//线程处理函数,参数与返回值不是必须的;
DWORD WINAPI ThreadProc(LPVOID lpThreadParameter)
{
	INT *p = (INT*)lpThreadParameter;
	for (INT i = 0; i < *p; i++){
		Sleep(500);
		printf("+++++++++++++%d\n", i);
	}
	return 0;
}

int main()
{
	HANDLE hThread;
	INT n = 10;
	hThread = CreateThread(NULL, 0, ThreadProc, &n, 0, NULL);
	//类似linux中wait,比wait方便;第一个参数是句柄,第二个参数指定超时时间
	WaitForSingleObject(hThread, INFINITE);
	printf("线程执行完毕\n");
	getchar();
	return 0;
}

5.等待线程API演示2

/**
*CreateThread.c
*/
#include <stdio.h>
#include <windows.h>

//线程处理函数,参数与返回值不是必须的;
DWORD WINAPI ThreadProc(LPVOID lpThreadParameter)
{
	INT *p = (INT*)lpThreadParameter;
	for (INT i = 0; i < *p; i++){
		Sleep(500);
		printf("+++++++++++++%d\n", i);
	}
	return 0;
}

int main()
{
	HANDLE hThreadArr[2];
	INT n = 10;
	DWORD	dwResult0;
	DWORD	dwResult1;
	hThreadArr[0] = CreateThread(NULL, 0, ThreadProc, &n, 0, NULL);
	hThreadArr[1] = CreateThread(NULL, 0, ThreadProc, &n, 0, NULL);
	//等待多个对象,第一个参数为个数,第二个为句柄数组,状态标志等待一个还是所有,
	//最后一个参数为超时时间
	WaitForMultipleObjects(2, hThreadArr, TRUE, INFINITE);
	//获取线程退出码
	GetExitCodeProcess(hThreadArr[0], &dwResult0);
	GetExitCodeProcess(hThreadArr[1], &dwResult1);
	printf("线程执行完毕\n");
	CloseHandle(hThreadArr[0]);
	CloseHandle(hThreadArr[1]);
	getchar();
	return 0;
}

6.获取线程上下文,也可以设置进程上下文

/**
*CreateThread.c
*/
#include <stdio.h>
#include <windows.h>

//线程处理函数,参数与返回值不是必须的;
DWORD WINAPI ThreadProc(LPVOID lpThreadParameter)
{
	INT *p = (INT*)lpThreadParameter;
	for (INT i = 0; i < *p; i++){
		Sleep(500);
		printf("+++++++++++++%d\n", i);
	}
	return 0;
}

int main()
{
	HANDLE hThreadArr[2];
	INT n = 10;

	hThreadArr[0] = CreateThread(NULL, 0, ThreadProc, &n, 0, NULL);
	hThreadArr[1] = CreateThread(NULL, 0, ThreadProc, &n, 0, NULL);
	
	//挂起线程
	SuspendThread(hThreadArr[0]);
	CONTEXT context;
	context.ContextFlags = CONTEXT_INTEGER;
	//获取线程上下文
	GetThreadContext(hThreadArr[0], &context);
	//打印寄存器的值
	printf("%x %x\n", context.Eax, context.Edx);
	ResumeThread(hThreadArr[0]);

	CloseHandle(hThreadArr[0]);
	CloseHandle(hThreadArr[1]);

	getchar();
	return 0;
}

猜你喜欢

转载自blog.csdn.net/lifeshave/article/details/84801076