该线程内核对象不是线程本身.PPT

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
主要内容 Windows操作系统的一些基本知识 Win32 API线程库 线程间通信 调度优先级 1. Windows操作系统的一些基本知识 API ( Application Programming Interface ) 操作系统是由本身的API定义的。 API包含了所有构造操作系统的应用程序的函数接口,同时包含了相关的数据类型和结构。 32位版本Windows的API被称为Win32 直接用Win32 API编写的应用程序,程序的执行代码小,运行效率高 MFC用类库的方式将Win32 API 进行封装, 以类的方式提供给开发者 Framework类库提供了所有应用程序模型都要使用的一个面向对象的API集合 内核对象及句柄 内核对象是由操作系统内核分配的,只能由内核访问的一个内存块,用来供系统和应用程序使用和管理各种系统资源。 内核对象包括:符号对象、事件对象、文件映射对象、I/O完成端口对象、作业对象、信箱对象、互斥量、管道对象、进程对象、信标对象、线程对象和等待计时器对象等,这些对象通过调用函数来创建。 不同的对象拥有不同的数据结构,它的成员负责维护该对象的各种信息。 内核对象及句柄 如何操作内核对象? Windows提供了一组函数,使用这组函数来访问内核对象。 创建内核对象的函数,会返回一个句柄,任何线程都可以使用这个值,把这个句柄传递给Windows的各个函数,系统就知道操作哪个内核对象了。 进程被初始化时,系统为它分配一个句柄表,用于保存该进程使用的内核对象的信息,而句柄值则是相应内核对象在句柄表中的索引值,因此句柄值是进程相关的。 内核对象由内核拥有,各个进程可以共享内核对象。进程中止执行,它使用的内核对象并不一定会被撤销。 2. Win32 API的线程库 2.1 创建线程的基本问题 线程可以由进程中的任意线程创建,而进程的主线程在进程加载时自动创建。 每个线程都有自己的进入点函数。 主线程的进入点函数 线程函数----线程的入口点 2.2 创建线程的API函数 C/C++多线程运行期库中 线程创建函数 _beginthreadex _beginthreadex函数在创建线程之前会为线程分配数据块(tiddata),并对数据块初始化,然后将数据块与线程联系起来 再为线程函数建立结构异常化处理帧来处理线程函数中的异常。 2.3 操作线程的API 暂停线程 返回值是线程的前一个暂停计数 线程暂停是线程内核对象的一个内部值,用于指明线程的暂停计数。 使用要小心,因为不知道暂停线程运行时它在进行什么操作。可能造成死锁 2.3 操作线程的API 恢复线程 返回值是线程的前一个暂停计数 该函数用于将处于暂停状态的线程置于就绪状态,使其参加线程调度。 2.3 操作线程的API 使线程睡眠 该函数是线程暂停自己的运行,直到睡眠时间过去为止 当线程调用这个函数时,它自动放弃剩余的时间片,迫使系统进行线程调度。 Windows不是实时的操作系统。 2.3 操作线程的API 终止线程 线程函数返回(最好) 通过调用ExitThread函数,线程将自行撤销 同一个进程或另一个进程中的线程调用TerminateThread函数 包含线程的进程终止 线程返回函数 线程中创建的C++类对象能够正常撤销 操作系统将正确地释放线程堆栈使用的内存 系统将线程的退出代码(线程内核对象维护)设置为线程函数的返回值 系统将递减线程内核对象的使用计数 ExitThread函数 线程调用这个函数,强制线程终止运行 导致操作系统清除该线程使用的所有操作系统资源。 C++类对象将不被撤销。 TerminateThread函数 能够撤销任何线程 线程的内核对象的使用计数也被递减 异步运行的函数 不撤销线程的堆栈,直到进程终止 在进程终止运行时撤销线程 ExitProcess 和 TerminateProcess函数可以终止线程,这些线程将会终止进程中的所有线程 进程所使用的资源被清除 剩余线程被撤销 C++对象撤销函数没有被调用 线程内核对象示意图 在进程终止运行时撤销线程 2.4 一个简单的Windows多线程程序 3. 线程间通信 3. 线程间通信 下面两种情况下,线程间需要通信 当有多个线程访问共享资源而不希望共享资源遭到破坏;(互斥) 当一个线程需要将某个任务已经完成的情况通知另外一个或多个线程时。(同步) Windows线程通信方法主要有互锁函数、临界段、事件、互斥量、信号量 3.1 互锁函数 互锁函数是用来解决原子访问的,主要针对变量的原子访问; 原子访问:当线程访问资源时,能够确保没有其它线程同时访问相同的资源。 例子 Long g_x = 0; //全局变量 DWORD WINAPI ThreadFunc1 (PVOID

文档评论(0)

wumanduo11 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档