学习:多线程

正常的多线程实现方式:

CreateThread  创建线程
SuspendThread 挂起线程
ResumeThread  恢复线程
#include<windows.h>
#include<stdio.h>


DWORD WINAPI  MyThreadFun(LPVOID pParameter) {
	for (int i = 100; i > 0; i--) {
		printf("%d---MyThreadFun
", i);
		Sleep(1000);
	}
	return 0;
}

int main() {
	HANDLE hThread;
	hThread = CreateThread(
		NULL,  //获取默认的安全描述符,当前用户的令牌权限 
		0,  //使用可执行文件的默认大小
		(LPTHREAD_START_ROUTINE)MyThreadFun,  // 创建线程调用的函数
		NULL,  // 传递函数中的参数
		0, //线程在创建后立即运行 
		NULL // 不返回线程标识符
	);
	printf("线程启动!
");
	SuspendThread(hThread);
	printf("线程被挂起!
");
	Sleep(5000);
	ResumeThread(hThread);
	Sleep(5000);
	printf("线程被恢复!
");
	
	CloseHandle(hThread); // 线程被清理的两个必要条件:1、线程内核对象的计数器为0    2、线程的执行代码执行完毕 ,这里的话只有线程中执行完才会进行CloseHandle
	getchar();
	return 0;

}

用CreateThread创建线程函数不一定需要定义为DWROD类型,并且具有返回值,如下也可以:但是需要注意的是在CreateThread中传参时候需要进行强转为(LPTHREAD_START_ROUTINE)类型才行

void MyThreadFun(LPVOID pParameter) {
	for (int i = 100; i > 0; i--) {
		printf("%d---MyThreadFun
", i);
		Sleep(1000);
	}
}

对于以下的三个函数的作用:

WaitForSingleObject 当线程执行完毕之后,恢复阻塞,该函数具有局限性 只能等待单个线程执行完毕的情况
WaitForMultipleObjects 用来等待多个线程执行完毕的情况,上面的函数的升级版
GetExitCodeThread  用来得到线程函数的返回值
#include<windows.h>
#include<stdio.h>

void MyThreadFun(LPVOID pParameter) {
	for (int i = 5; i > 0; i--) {
		printf("%d---MyThreadFun
", i);
		Sleep(500);
	}
}

int main() {
	
	HANDLE hThread;

	hThread = CreateThread(
		NULL,  //获取默认的安全描述符,当前用户的令牌权限 
		0,  //使用可执行文件的默认大小
		(LPTHREAD_START_ROUTINE)MyThreadFun,  // 创建线程调用的函数
		NULL,  // 传递函数中的参数
		0, //线程在创建后立即运行 
		NULL // 不返回线程标识符
	);
	printf("线程启动!
");
	WaitForSingleObject(hThread, INFINITE); // 当线程执行完毕之后,恢复阻塞  ,该函数具有局限性 只能等待单个线程执行完毕的情况
	CloseHandle(hThread); // 线程被清理的两个必要条件:1、线程内核对象的计数器为0    2、线程的执行代码执行完毕 ,这里的话只有线程中执行完才会进行CloseHandle
	getchar();
	return 0;

}


在单核CPU的机器中进行多线程运行的时候,一个单核执行多个任务。假如有10个任务,单核CPU执行了1个任务的百分之十,就会换另一个任务继续进行再到百分之十继续换,但是之前百分之十是如何进行保存的,多线程进行操作的时候,每个任务都会有一个context结构体,里面的寄存器用来保存当前任务的完成进度,下面两个函数就能对这个结构体进行获取/设置相应的值。

GetThreadContext 获取线程上下文
SetThreadContext 设置线程上下文
#include<windows.h>
#include<stdio.h>

void MyThreadFun(LPVOID pParameter) {
	for (int i = 5; i > 0; i--) {
		printf("%d---MyThreadFun
", i);
		Sleep(500);
	}
}

int main() {
	HANDLE hThread;
	hThread = CreateThread(
		NULL,  //获取默认的安全描述符,当前用户的令牌权限 
		0,  //使用可执行文件的默认大小
		(LPTHREAD_START_ROUTINE)MyThreadFun,  // 创建线程调用的函数
		NULL,  // 传递函数中的参数
		0, //线程在创建后立即运行 
		NULL // 不返回线程标识符
	);

	WaitForSingleObject(hThread, INFINITE); // 当线程执行完毕之后,恢复阻塞  ,该函数具有局限性 只能等待单个线程执行完毕的情况
	printf("线程执行完毕!
");

	CONTEXT cont;
	GetThreadContext(hThread, &cont);
	printf("eax: %x
ebx:%x
",cont.Eax,cont.Ebx);

	cont.Eax = 0xccccccca;

	SetThreadContext(hThread, &cont);
	printf("eax: %x
ebx:%x
", cont.Eax, cont.Ebx);
	CloseHandle(hThread); // 线程被清理的两个必要条件:1、线程内核对象的计数器为0    2、线程的执行代码执行完毕 ,这里的话只有线程中执行完才会进行CloseHandle
	getchar();
	return 0;

}

原文地址:https://www.cnblogs.com/zpchcbd/p/12248459.html