- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
麦洛克菲内核开发第三课多线程同步IRQL内核数据结构.ppt
线程的运行级别(IRQL) 神马是中断?中断优先级 无中断: PASSIVE_LEVE(0) 软中断: APC_LEVEL (1) DISPATCH_LEVEL(2) 硬中断: DIRQL 设备中断请求级处理程序执行 PROFILE_LEVEL 配置文件定时器 CLOCK2_LEVEL 时钟 SYNCH_LEVEL 同步级 IPI_LEVE 处理器之间中断级 POWER_LEVEL 电源故障级 如何遵守中断级别要求? 明白驱动中各个函数的中断级别 明白要调用的API的运行级别 PASSIVE级别可以使用任何函数和内存 DISPATCH级别只能访问能运行在DISPATCH级别的API和非分页内存 NONPAGEPOOL内存可在任何级别使用 PAGEDPOOL只能在PASSIVE_LEVEL和APC_LEVEL使用 在PASSIVE和APC级别代码中加:PAGED_CODE()宏 #define PAGED_CODE() \ { if (KeGetCurrentIrql() APC_LEVEL) { \ KdPrint(( EX: Pageable code called at IRQL %d\n, KeGetCurrentIrql() )); \ ASSERT(FALSE); \ } \ } 多线程安全 什么是多线程? 与进程区别: 进程:资源分配单位 线程:调度单位 带来什么问题?(R3的例子说明) 程序一致性(线程安全性) 局部变量 全局变量以及资源 同步? 互斥? 创建一个R3多线程(1) ULONG WINAPI ThreadProc(void* arg) { return 1; } VOID StartThread() { HANDLE hThread = NULL; hThread = CreateThread(NULL, 0, ThreadProc, NULL, 0, NULL); WaitForSingleObject(hThread, INFINITE); CloseHandle(hThread); hThread = NULL; } 创建一个R3多线程(2) UINT WINAPI ThreadProc(LPVOID lpParameter) { return 0; } unsigned tid = 0; HANDLE hThread = (HANDLE)_beginthreadex( NULL, 0, ThreadProc, NULL, 0, tid); WaitForSingleObject( hThread, INFINITE ); CloseHandle(hThread); hThread = NULL; 创建一个R3多线程(3) UINT threadProc(LPVOID v) { AfxEndThread(0); } CWinThread *pThreadR = AfxBeginThread(threadProc,(LPVOID)param); pThreadR-SuspendThread(); pThreadR-m_bAutoDelete = FALSE; pThreadR-ResumeThread(); if (WaitForSingleObject(pThreadR-m_hThread, 2*1000)==WAIT_TIMEOUT) { TerminateThread(pThreadR-m_hThread, 0); } delete (pThreadR); pThreadR = NULL; 三个函数的区别 CreateThread:是Windows的API函数(SDK函数的标准形式,直截了当的创建方式,任何场合都可以使用),提供操作系统级别的创建线程的操作,且仅限于工作者线程。不调用MFC和RTL的函数时,可以用CreateThread,其它情况不要使用。因为: C Runtime中需要对多线程进行纪录和初始化,以保证C函数库工作正常。 MFC也需要知道新线程的创建,也需要做一些初始化工作。 有些CRT的函数象malloc(),fopen(),_open(),strtok(),ctime(),或localtime()等函数需要专门的线程局部存储的数据块,这个数据块通常需要在创建线程的时候就建立,如果使用CreateThread,这个数据块就没有建立,但函数会自己建立一个,然后将其与线程联系在一起,这意味着如果你用CreateThread来创建线程,然后使用这样的函数,会有一块内存在不知
您可能关注的文档
最近下载
- 2025年中国四氯化锆项目投资计划书.docx
- 八师兵团职工考试题库及答案.doc
- 健康保险的论文开题报告.docx VIP
- [自学考试密押题库与答案解析]高级英语自考题模拟2.docx VIP
- 基于利益相关者理论的企业协同发展战略研究.doc VIP
- 五年级上册英语教案Lesson 3 What Subject Do You Like Best? 川教版三年级起点.doc VIP
- 劳动通识课件 第5章 家庭劳动实践.pptx VIP
- 2025年四川省普通高中学业水平合格考数学试卷(补考)(含答案).pdf VIP
- DB13T 2501-2017 风力塔筒自动免爬器技术条件.pdf VIP
- 《建筑基桩检测技术规范2023》.pdf VIP
文档评论(0)