1.进程:动态执行的过程,操作系统进行资源分配和调度的独立单位,时应用程序运行的载体。一个程序可以启动多个进程。
2.线程:是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
3.线程和进程:
//1.进程类似于工厂是系统分配资源的基本单位,线程类似于工厂中的工人是CPU调度和执行的基本单位
//2.一个进程由一个或者多个线程组成。
//3.进程之间相互独立,但同一个进程下的线程之间是共享程序的内存空间(代码段,数据集,堆栈)
//4.线程上下文切换比进程上下文切换快的多
同一进程中的多条线程将共享该进程中的全部系统资源,如虚拟地址空间,文件描述符和信号处理等等。但同一进程中的多个线程有各自的调用栈,自己的寄存器环境,自己的线程本地存储。
4.线程的创建和销毁(基于windows)
在windows系统中要调用线程函数要包含windows.h的头文件
//1:CreateThread()创建线程函数。返回的是线程的句柄
其一共有六个参数。参数1:安全描述符,一般为NULL。
参数2:线程栈的大小。参数3:线程函数的地址。参数4:线程函数的参数(要将传的参数转换为void *类型)。 参数5:线程的初始状态,可以设置为挂起或者创建即运行的状态。参数6:线程ID
//2:TerminateThread。杀死线程。参数为句柄
//3:CloseHandle。关闭句柄。参数几位要关闭的句柄
//4:WaitForSingleObject。等待指定对象的信号。参数1:信号的句柄。参数2:等待时间
返回值为WAIT_TIMEOUT等。具体可查文档
#include <iostream>
#include<windows.h>
using namespace std;
bool isout = true; //通过定义一个标志位来让线程结束
//线程函数
DWORD WINAPI threadpro1(LPVOID ip) //LPVOID 是void* 类型,可以强转成任意类型.
{
int con = (int)ip;
for (int k = 0; k < con; k++)
{
//Sleep(100);
if (isout) //判断标志位
cout << "asd" <<k<< endl;
else
return 0;
Sleep(100);
}
return 0;
}
int main111()
{
DWORD thread = 0;
HANDLE handle = CreateThread(
NULL/*安全描述符*/,0,threadpro1,(void *)100,CREATE_SUSPENDED,& thread);
int i = 0;
while(1) {
//Sleep(1000); //以ms级别睡眠
i++;
cout << "睡了" << i << "秒" <<endl;
if(i == 100) {
break;
}
}
cout << "睡醒了" << endl;
isout = false;//退出线程 //结束所创建的线程
if (WAIT_TIMEOUT == WaitForSingleObject(handle,100))//等待一段时间看线程是否退出。因为线程切换要有时间
{
TerminateThread(handle, -1);
cout << "强制杀死" << endl;
}
if(handle)
CloseHandle(handle); //关闭句柄
handle = NULL;
cout << "结束线程" << endl;
system("pause");
return 0;
}
注意: 操作系统 会给每一个线程分配一个内核对象(用户和内核之间交互的接口),用计数器进行管理。
//回收内核对象:1.线程退出(一种是线程正常执行完。)(强制退出,但可能会造成执行错误,一般不建议terminatethread)2.关闭句柄(closehandle)才能将内核对象销毁,如果不将内核对象销毁就会造成内存泄露。