Windows内核之线程简介

1 线程定义

<1> 内核对象,操作系统用它来对线程实施管理。内核对象也是系统用来存放线程统计信息的地方

<2>另一个是线程堆栈,它用于维护线程在执行代码时需要的所有函数参数和局部变量.

2 线程和进程的区别

<1>进程是不活泼的。进程从来不执行任何东西,它只是线程的容器。

<2>线程在它的进程地址空间中执行代码,并且在进程的地址空间中对数据进行操作。

<3>线程共享进程的地址控件

<4>线程只有一个内核对象和一个堆栈,保留的记录很少,开销比进程少很多。

 

3 线程函数

线程分为主线程以及一般线程。主线程的入口点函数必须是main,wmain,WinMain,wWinMain,一般线程函数则可以随便命名。并且必须要有一个函数返回值。

 

4 创建线程

HANDLE CreateThread( 
  LPSECURITY_ATTRIBUTES   lpThreadAttributes,       // SD
 SIZE_T         dwStackSize,                       // initial stack size
 LPTHREAD_START_ROUTINE      lpStartAddress,    // thread function
 LPVOID         lpParameter,            // thread argument
 DWORD      dwCreationFlags,         // creation option
  LPDWORD   lpThreadId              // thread identifier);

<1>lpThreadAttributes

指向一个SECURITY_ATTRIBUTES的指针,指定安全属性,当为NULL的时候,会利用系统默认的安全属性

<2> dwStackSize

设置线程栈的初始大小,以字节为单位,系统会把它四舍五入到页面大小的最近值,当设置为NULL 的时候,会采取系统的默认值。

<3> lpParameter

指向应用程序定义的LPTHREAD_START_ROUTINE类型的函数的指针,这个函数将有新线程执行,表示线程的新的起始地址。指定一个函数做位新线程的入口地址,函数的名称任意,但是类型必须按照下面的格式:

DWROD   WINAPI    ThreadProc(LPVOID lpParameter);

<4> lpParameter

传递给线程的参数

<5> dwCreationFlags

设置用于线程创建的附加标记。是CREATE_SUSPENDED或者0两者之一,如果是CREATE_SUSPENDED表示线程不立即执行,知道ResumeThread函数开始执行。

<6> lpThreadId

这是一个返回值,用于表示函数的线程ID。

 

系统给线程分配的堆栈是从进程的地址空间中分配的,所有线程共享进程地址空间,他们之间通信很方便。

注意:CreateThread是Windows函数,如果要编写C/C++的多线程函数,那么就需要使用_beginTreadx函数

 

5 线程的终止运行

<1>线程函数的返回

<2>通过ExitThread函数撤销线程,不过最好不用

<3>同一个进程或者另一个进程中的线程调用TerminateThread函数,应该避免用

<4>包含线程的进程的终止运行,应该避免用

5.1 线程函数返回时做的事情

<1>在线程函数中创建的所有C + +对象均将通过它们的撤消函数正确地撤消

<2>操作系统将正确地释放线程堆栈使用的内存

<3>系统将线程的退出代码(在线程的内核对象中维护)设置为线程函数的返回值

<4>系统将递减线程内核对象的使用计数

5.2 ExitThread 函数

它能够使操作系统清除所有的操作系统资源,包括线程的堆栈,但是C++资源将不会被撤销

5.3 TerminateThread 函数

这个函数能够停止任何线程,但是它不会发送任何通知消息给将要撤销的线程,并且它是异步的,不能保证函数返回的时候,函数线程已经被终止。在进程终止前,线程的堆栈是不会被清除的,这样方便其他线程使用。

5.4 进程终止时线程的终止

同样的问题是进程强制终止,会造成

5.5 线程终止时候发生的事情

<1>线程的退出代码从S T I L L _ A C T I V E改为传递给E x i t T h r e a d或Te r m i n a t e T h r e a d的代码

<2>线程内核对象的状态变为已通知

<3>如果线程是进程中最后一个活动线程,系统也将进程视为已经终止运行

<4>线程内核对象的使用计数递减1

 

注意:通过检查线程句柄的推出去代码可以检查线程是否已经终止。响应的函数是:

BOOL GetExitCodeThread(HANDLE hThread,LPDWORD lpDword)

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值