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;
}
- 线程的挂起与释放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;
}