windows核心编程之进程&线程

在前一章总结内核对象时提到过进程内核对象和线程内核对象,但是对进程线程以及进程内核对象和线程内核对象在其中的意义还不是很清楚,下面就详细说说进程与线程,进程内核对象和线程内核对象,进程与进程内核对象,线程与线程内核对象之间的千丝万缕的联系。

 

在开始之前,提出两个面试中经常遇到的简单问题:(1)进程与线程的联系和区别 (2)在多线程编程中为什么要考虑同步互斥操作?两个问题的解答在本章最后给出。

 

1、进程与线程

      进程是一个具有独立功能的程序关于某个数据集合的一次运行活动,进程是一个执行中的程序,是一个活动的实体,是线程的容器,这都是进程的定义。举例来说,打开电脑中的一个可执行的应用程序,比如IE浏览器,这就是一个进程,当对IE浏览器执行操作就是其中的一个线程。

     进程是不活跃的,真正活跃的是进程中的线程,一个进程中至少有一个线程,那就是主线程,通过主线程可以创建多个线程,也就是以后会总结到的多线程。

   进程包括进程内核对象和进程地址空间,同样线程也是。

  (1)线程内核对象:线程内核对象是一个小的数据结构体,维护了与线程有关的各种属性,如线程的使用次数,对象是否被通知,线程的暂停计数等。

  (2)线程堆栈:在线程内核对象创建完成后,系统会分配给线程堆栈内存,该内存来自于进程的地址空间,线程堆栈内保存着函数指针及数据等信息。

2、线程的创建过程

在windows中调用线程创建函数CreateThread函数可以创建一个线程,确切的说是创建了一个线程内核对象,线程内核对象的相关属性被设置,其中线程内核对象的使用计数被设置为2,暂停计数为1,且为未通知状态。

线程内核对象创建完成之后分配线程堆栈,进而执行线程代码。

 

3、线程的终止运行过程

   当线程函数正常返回后,线程函数中所有创建的C++对象及内存释放,进而线程堆栈释放,线程内核对象的使用计数递减,通过closeHandle关闭该内核对象。当使用计数为0时,该内核对象会被系统撤销。

 

4、问题解答

(1)进程与线程的联系和区别

进程是线程的容器,一个进程至少有一个线程。

(2)为什么会有同步互斥

进程中的线程共享进程的地址空间以及其他各种资源,而windows操作系统又是资源抢占式的,因此在一个进程中有多个线程时,就可能会导致多个线程抢占同一资源,并且不可控,因此在多个线程编程中要设置同步互斥,以保证在某一时刻资源被某一个线程占有,其他资源无权占有。

什么是线程的同步呢?本人认为线程同步并不是线程要同步执行,而是针对多个线程的共享资源来说的,即多个线程对共享资源的拥有是同步的,举一个简单的例子:线程thread1和线程thread2共同访问一个变量 globalvar且为其做加1操作,即如下所示

int globalvar = 0;

void thread1()
{

	globalvar ++;
}

void thread2()
{
	globalvar ++;
}

对一个变量做++操作需要经过以下三个步骤:
(1)将变量从静态存储空间中取出

(2)将变量加入到寄存器中并且加1

(3)将加1后变量放入静态存储空间中

假设thread1正在执行步骤3,此时thread2同样开始执行加1操作,这时thread2取出的数据为0而不是thread1执行加法之后的1,这就是thread1和thread2没有同步,因此需要保证多个线程对资源的拥有是同步的。

要保证线程同步有很多种方法,待后面介绍。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Windows核心编程中,线程进程的最小执行单位,负责执行进程地址空间中的代码。可以将进程理解为一个容器,而线程是在这个容器中执行代码的实体。每个进程都至少有一个线程,被称为主线程,可以通过代码创建其他线程,也称为子线程线程的好处包括易于调度、提高并发性、开销小、利于发挥多处理器系统的功能。通过创建多个线程,每个线程在一个处理器上运行,实现应用程序的并发性,提高系统的整体性能。 进程线程的区别在于一个线程只能属于一个进程,但一个进程可以包含多个线程。资源分配给进程,而处理器分配给线程,即真正运行在处理机上的是线程线程在执行中需要协作同步。 在Windows核心编程中,可以使用CreateThread函数创建线程。该函数的参数包括线程的安全属性、线程栈的大小、线程函数、传递给线程函数的参数、线程创建的标记以及用于接收线程ID的指针。调用CreateThread函数成功后,会返回线程的句柄,可以用于操作该线程。 在线程的调度中,可以通过调用SuspendThread函数将线程挂起。而通过调用ResumeThread函数可以恢复被挂起的线程。 对于线程的终止,可以使用TerminateThread函数,但在设计时应尽量避免使用该函数。TerminateThread函数可以告诉系统要终止线程,但函数返回时并不能保证线程已经被终止。 另外,为了控制线程的执行速度,也可以使用Sleep函数来使线程进入睡眠状态一段时间。 总结来说,在Windows核心编程中,线程是执行进程代码的最小单位,可以通过CreateThread函数创建线程,通过SuspendThread函数挂起线程,通过ResumeThread函数恢复线程,通过Sleep函数控制线程的执行速度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值