正常的多线程实现方式:
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;
}