这里来讲讲线程我也是刚刚开始学习,希望有错误的地方大家指出来。
1.概念:
线程是计算机中最小的执行单元。通常,当Windows应用程序运行时,操作系统都会为其自动创建一个线程,即主线程。通过主线程,用户可以创建多个线程或进程。由于一个进程中的所有线程共享该进程地址空间,所以,在同一个进程中可以实现多个线程间的相互通信。
为了完成某一项功能可以使用多线程技术创建多个线程共同完成这个功能。这种方法比单线程技术实现同一功能的效率快。
实际上 ,有的cpu只支持单线程技术,但是一个多线程程序还是能够运行,而且用户感觉几个线程在同时运行。这是因为系统程序为系统中的每个线程分配了执行时间(时间片),而且这个时间非常短,以致用户都感觉是多线程在同时运行。
2.创建线程
在VC中编程可以调用API函数CreateThread()创建线程。
HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes,
DWORD dwStackSize,
LPTHREAD_START_ROUTINE lpStartAddress,
LPVOID lpParameter,
DWORD dwCreationFlags,
LPDWORD lpThreadId
);
函数调用成功返回一个线程的句柄。
lpThreadAttributes : 是一个指向结构体SECURITY_ATTRIBUTES 的指针,表示新创建的线程的安全属性。可以设置为NULL,使用默认安全属性。
dwStackSize : 线程初始化时地址空间大小,设置为0看、表示与调用该函数的线程地址空间大小一样。
lpStartAddress : 线程的线程函数的地址。线程创建成功后新线程将调用该线程函数执行某个功能。
lpParameter : 将要传递给新建线程的命令行参数。新建线程可以根据该命令参数的不同而执行不同的功能。
dwCreationFlags : 新建线程创建后是否立即运行。(CREATE_SUSPENDED 线程创建成功后暂停运行;0 线程创建成功后立即运行)
lpThreadId : 新建线程的ID号。可以设为NULL。
3.代码示例
#include <Windows.h>
#include <iostream>
using namespace std;
DWORD WINAPI myfun1(LPVOID lpParameter);
DWORD WINAPI myfun2(LPVOID lpParamener);
int main()
{
HANDLE h1, h2;
h1 = CreateThread(NULL, 0, myfun1, NULL, 0, NULL);
printf("线程1开始运行!\n");
h2 = CreateThread(NULL, 0, myfun2, NULL, 0, NULL);
printf("线程2开始运行!\n");
CloseHandle(h1);
CloseHandle(h2);
Sleep(10000);
return 0;
}
DWORD WINAPI myfun1(LPVOID lpParameter)
{
cout<< "线程1正在运行!"<<endl;
return 0;
}
DWORD WINAPI myfun2(LPVOID lpParameter)
{
cout<< "线程2正在运行!"<<endl;
return 0;
}