线程的基本概念
线程,有时称为轻量级进程,是CPU使用的基本单元;它由线程ID、程序计数器、寄存器集合和堆栈组成。它与属于同一进程的其他线程共享其代码段、数据段和其他操作系统资源(如打开文件和信号)。
线程与进程的区别和联系
进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。
线程是进程的一个实体,是CPU调度和分派的基本单位, 它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。
(1)一个进程至少会有一个线程。
(2)线程不能独立执行,必须依存在程序中。
(3)线程的划分尺度小于进程。
(4)进程是资源分配的最小单位,线程是调度的最小单位。
线程和进程在使用上各有优缺点:线程执行开销小,但不利于资源的管理和保护;而进程正相反。同时,线程适合于在SMP机器上运行,而进程则可以跨机器迁移。
线程的基本状态
线程从开始创建到结束,共有五种基本状态:新建状态、就绪状态、运行状态、阻塞状态及死亡状态。
c/c++多线程编程
#include<stdio.h>
#include<windows.h>
DWORD WINAPI ThreadFunction(LPVOID pM)
{
printf("Hello world!\n");
return 0;
}
int main()
{
HANDLE handle = CreatThread(NULL, 0, ThreadFunction, NULL, 0, NULL);
WaitForSingObject(handle, INFINITE);
return 0;
}
CreateThread()函数有六个参数,
1. para1表示线程内核对象的安全属性,一般传入NULL表示使用默认设置。
2. para2表示线程栈空间大小。传入0表示使用默认大小(1MB)。
3. para3表示新线程所执行的线程函数地址,多个线程可以使用同一个函数地址。
4. para4是传给线程函数的参数。
5. para5指定额外的标志来控制线程的创建,为0表示线程创建之后立即就可以进行调度,如果为CREATE_SUSPENDED则表示线程创建后暂停运行,这样它就无法调度,直到调用ResumeThread()。
6. para6将返回线程的ID号,传入NULL表示不需要返回该线程ID号。
函数返回值为线程句柄,对于线程句柄,类似于指针,一般通过句柄操作对象(有句柄的对象一般都是系统级别的对象,称之为内核对象)。
如果不加WaitForSingleObject()语句,可能看不到输出。这个函数的作用是使线程进入等待状态,等待内核对象被触发。由于CreateThread()只有在线程运行结束后才会返回handle句柄,此时内核对象被触发,线程才能继续执行。