在嵌入式编程中,经常会用到中断来对一些必要请求进行及时响应,同时又不占用太多系统资源。然而在Windows环境下进行编程,如何实现类似功能,则需要用到『线程』编程,线程在Wikipedia上的定义如下:
线程(英语:thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。在Unix System V及SunOS中也被称为轻量进程(lightweight processes),但轻量进程更多指内核线程(kernel thread),而把用户线程(user thread)称为线程。
Windows下多线程编程
Windows下多线程编程可以利用Windows SDK
提供的函数CreateThread()
创建线程,在使用时需要包含头文件Windows.h
。根据微软开发者中心的介绍,CreateThread()
函数定义如下:
HANDLE WINAPI CreateThread(
LPSECURITY_ATTRIBUTES lpsa,
DWORD cbStack,
LPTHREAD_START_ROUTINE lpStartAddr,
LPVOID lpvThreadParam,
DWORD fdwCreate,
LPDWORD lpIDThread
);
参数简介:
-
LPSECURITY_ATTRIBUTES lpsa
是安全树形结构体,主要控制该线程的句柄可否为进程的子进程继承使用,默认使用NULL表示不能继承;若想继承线程句柄,则需要设置改结构体,将结构体的bInheritHandle成员初始化为TRUE; -
DWORD cbStack
表示线程初始栈的大小,若是0则表示默认大小初始化; -
LPTHREAD_START_ROUTINE lpStartAddr
表示线程开始的位置,即函数入口位置; -
LPVOID lpvThreadParam
用来接收线程过程函数的参数,不需要时可以设置为NULL; -
DWORD fdwCreate
表示线程创建时的标志,CREATE_SUSPENDED表示线程创建后挂起暂不执行,必须调用ResumeThread才可以执行,0表示线程创建后立即执行; -
LPDWORD lpIDThread
保存线程的ID
Windows下多线程编程实例
#include <iostream>
#include <Windows.h>
#include <stdio.h>
using namespace std;
DWORD WINAPI ThreadFcn(LPVOID pParam)
{
int i = 0;
while (i++ < 10)
{
printf("线程开启成功,第%d次运行线程1\n",i);
}
return 0;
}
int main()
{
//创建线程
HANDLE hThread = CreateThread(NULL, 0, ThreadFcn, NULL, 0, NULL);
//关闭线程
CloseHandle(hThread);
int j = 0;
while(j++ < 5)
{
printf("第%d次运行主线程\n",j);
}
system("pause");
return 0;
}
运行结果如下图所示:
多线程编程运行结果
从结果可以看出,两个线程明显是并行运行的,运行过程中互不干扰。