Windows线程库

Win32 API 是Windows操作系统为内核以及应用程序之间提供的接口,将内核提供的功能进行函数封装,应用程序通过调用相关的函数获得相应的系统功能。

MFC 是微软基础函数类库,由微软提供的,用类库的方式将Win32 API进行封装,以类的方式开发者。

HANDLE

          句柄是一种指向指针的指针。指针是一种内存地址,应用程序启动后,组成这个程序的各对象是驻留在内存的。如果简单的理解,似乎我们只要知道这个内存的首地址,那就可以随时用这个地址访问对象。但是,这个是不正确的。

          Windows是一个以虚拟内存为基础的操作系统,在这种操作系统环境下,Windows内存管理器经常在内存中来回移动,以此来满足各种应用程序的内存需要。对象被移动以为着它的地址变化了。如果地址总是如此变化,我们该到哪里去找该对象呢?!为了解决这个问题,Windows系统为各应用程序腾出了一些内存存储地址,用来专门登记各应用对象在内存中的地址变化,而这个地址(存储单元的位置)本身是不变的。在应用程序中使用的变量如指针使用的是相对寻址方式,没有加段地址,使用的是相对于段地址的段偏移;在一些需要被操作系统调用、操作系统操作的变量,使用相对地址则会出现很多问题,因为段地址是无法确定的,因此系统就无法准确获取变量的地址,因此要使用句柄。

          Windows中的句柄实际上是一个唯一的数字,它引用一个Windows对象,例如窗口或图表等。

          Windows内存管理器在移动对象在内存中的位置后,把对象新的地址告知这个句柄地址来保存,这样我们只需要记住这个句柄地址就可以间接的知道具体在内存中的哪个位置。这个地址是在对象装载(Load)时由系统分配的。当系统卸载时(UnLoad)又释放给系统。

          句柄地址(稳定)->记载着对象在内存中的地址->对象在内存中的地址(不稳定)->实际对象

创建线程函数:CreateThread和_beginthread(process.h)

线程的挂起与恢复

            进程中的每个线程都有挂起计数器(suspend count)。当挂起计数器值为0时,线程被执行;当挂起计数器值大于0时,调度器不去调度该线程。

            DWORD SuspendThread(HANDLE);

            DWORD ResumeThread(HANDLE)。

 线程睡眠

             void WINAPI Sleep(DWORD dwMiliseconds);

线程终结:

              void  ExitThread(DWORD);

             void _endthread();

              void _endthreadex(unsigned retval);

              BOOL WINAPI TerminateThread(HANDLE,DWORD)

获取线程返回值

              BOOL WINAPI GetExitCodeThread(HANDEL);

线程的退出:

               释放操作系统资源,在线程结束前要清除线程及其所占资源。

线程退出调用函数:

               CloseHandle


线程间的通信:

         1,当有多个线程访问共享资源而不希望由于共享使资源遭到破坏时;               线程互斥

         2,当一个线程需要将某个任务已经完成的情况通知另外一个或多个线程时;   线程同步

线程间通信的方法主要包括:

           互锁函数 :函数执行以原子操作方式进行。

           临界段

           事件

           互斥量

           信号量

Window中的某些内核对象包含着一个特殊的属性,用来表示该内核对象是否处于已通知状态还是未通知状态。

主要内核对象有:

         进程:文件修改通知

         线程:事件

         作业:可等待定时器

         文件:信号量

         控制台输入:互斥量

有两种不同类型的事件对象,一种是人工重置的事件,另一种是自动重置的事件。当人工重置的事件得到通知时,等待该事件的所有线程均变为可调度线程。当一个自动重置的事件得到通知时,等待该事件的线程中只有一个线程变为可调度线程。

调度优先级

Windows 是一个多任务多线程操作系统,它采取的调度方法是基于优先级的时间片轮转抢占式调度。每个线程都会被赋予一个从0(最低)到 31(最高)的优先级号码。
相对高优先级的线程总是被系统优先调度;对于同优先级的线程,系统将对其采取时间片轮转的调度方式;
对于相对低优先级的线程,则将处于就绪状态,直到相对高优先级的线程执行完毕。
高优先级的线程可以即时地获得 CPU,不管正在运行的低优先级线程在做什么,都将被暂停而让出 CPU。

















             

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值