ImageVerifierCode 换一换
格式:DOCX , 页数:16 ,大小:20.77KB ,
资源ID:1089537      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-1089537.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(win3212进程和线程Word格式文档下载.docx)为本站会员(b****2)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

win3212进程和线程Word格式文档下载.docx

1、 CreateProcess - 目前最多使用BOOL CreateProcess( LPCTSTR lpApplicationName,/应用程序名称 LPTSTR lpCommandLine, /命令行参数 LPSECURITY_ATTRIBUTES lpProcessAttributes, /进程安全属性 SD LPSECURITY_ATTRIBUTES lpThreadAttributes, /线程安全属性 SD BOOL bInheritHandles, /进程的句柄继承 DWORD dwCreationFlags, /创建方式 LPVOID lpEnvironment, /环境信息

2、 LPCTSTR lpCurrentDirectory,/当前目录 LPSTARTUPINFO lpStartupInfo, /起始信息 LPPROCESS_INFORMATION lpProcessInformation /返回进程和线程的句柄ID);2 结束进程 VOID ExitProcess( (本进程自杀) UINT uExitCode / exit code for all threads BOOL TerminateProcess( (杀人) HANDLE hProcess, / handle to the process UINT uExitCode / exit code f

3、or the process3 打开进程 HANDLE OpenProcess( DWORD dwDesiredAccess, /访问权限 BOOL bInheritHandle, /继承标识(是否可以被当前进程的子进程使用) DWORD dwProcessId /进程ID 返回进程句柄4 关闭进程句柄 CloseHandle5 进程间的等候 等候 可等候的句柄 的信号可等候的句柄:必须有两种状态 1.有信号状态,2.无信号状态 DWORD WaitForSingleObject( HANDLE hHandle, /句柄 DWORD dwMilliseconds /等候时间 (毫秒为单位) 一

4、般为 INFINEITE (代表等候时间无限大) 阻塞函数,等候句柄的信号,只在句柄有信号或超出等候时间,才会结束等候。Windows线程Windows线程是可以执行的代码的实例。系统是以线程为单位调度程序。一个程序当中可以有多个线程,实现多任务的处理。Windows线程的特点:1)线程都具有1个ID2)线程具有自己的安全属性3)每个线程都具有自己的内存栈4)每个线程都具有自己的寄存器信息进程多任务和线程多任务: 进程多任务是每个进程都使用私有地址空间, 线程多任务是进程内的多个线程使用同一个地址空间。线程的调度: 将CPU的执行时间划分成时间片,依次根据时间片执行不同的线程。 在CPU眼中,

5、不认进程关系,按时间片安排 执行线程 线程轮询:线程A - 线程B - 线程A. 线程的使用1 定义线程处理函数DWORD WINAPI ThreadProc( LPVOID lpParameter /创建线程时,传递给线程的参数2 创建线程HANDLE CreateThread( (仅仅是运行定义起来,有没有运行,要看是否被调用) LPSECURITY_ATTRIBUTES lpThreadAttributes,/安全属性 SIZE_T dwStackSize, (0 默认大小1M) /线程栈的大小 LPTHREAD_START_ROUTINE lpStartAddress, /线程处理函数

6、的函数地址 (用来执行该线程要设定的任务) LPVOID lpParameter, /传递给线程处理函数的参数 DWORD dwCreationFlags,/线程的创建方式, LPDWORD lpThreadId (线程ID由系统分配)/创建成功,返回线程的ID 创建成功,返回线程句柄dwCreationFlags: 0 - 创建之后线程立刻执行 CREATE_SUSPENDED - 创建之后线程处于挂起状态。(不执行,挂起休眠)3 结束线程 结束指定线程 BOOL TerminateThread( HANDLE hThread, / handle to thread DWORD dwExit

7、Code / exit code 结束函数所在的线程 VOID ExitThread( DWORD dwExitCode / exit code for this thread4 关闭线程句柄 CloseHandle5 线程的挂起和执行 挂起 DWORD SuspendThread( HANDLE hThread / handle to thread 执行 DWORD ResumeThread(6 线程的信息 GetCurrentThreadId - 获取当前线程的ID GetCurrentThread - 获取当前线程的句柄 根据线程ID,获取其句柄 HANDLE OpenThread( D

8、WORD dwDesiredAccess, / access right BOOL bInheritHandle, / handle inheritance option DWORD dwThreadId / thread identifier 第三个参数是线程的ID 则返回线程的句柄 多线程的问题 线程A 。当线程A执行printf输出时,如果线程A的执行时间结束,系统会将线程A的相关信息(栈、寄存器)压栈保护,同时将线程B相关信息恢复,然后执行线程B,线程B继续输出字符。由于线程A正输出字符,线程B会继续输出,画面字符会产生混乱。_declspec(thread)CHAR g_szText

9、256 = 0;/全局变量时候,随时多线程,但一次只能有一个线程使用该全局变量所以加上前缀解决该问题/前缀说明 每个线程使用的都是该全局比那两的副本,全局变量本身不做变化线程同步技术 day14 / WinTls线程同步技术 原子锁 临界区(段) 事件 互斥 信号量 可等候计时器(略)实现加锁(类似于在UC中的)机制的有 临界区(段)(多个线程共同使用的资源) 互斥 等候函数WaitForSingleObject - 等候单个WaitForMultipleObjects - 等候多个DWORD WaitForMultipleObjects( DWORD nCount, /句柄数量 CONST

10、HANDLE *lpHandles, /句柄BUFF的地址 BOOL bWaitAll,/等候方式 DWORD dwMilliseconds / 等候时间返回值 WAIT_TIMEOUT 时间到bWaitAll - 等候方式 TRUE - 表示所有句柄都有信号,才结束等候 FASLE- 表示句柄中只要有1个有信号,就结束等候。1.原子锁(时间消耗) 相关问题 day14/WinInter 多个线程对同一个数据进行原子操作,会产生结果 丢失。比如执行+运算时, 当线程A执行g_nValue1+时,如果线程切换时间 正好是在线程A将值保存到g_nValue1之前, 线程B继续执行g_nValue1

11、+,那么当线程A再次被切换回来之后,会将原来线程A保存的值保存到g_nValue1上,线程B进行的加法操作被覆盖。-例WinInter解析-两个线程自加同一个变量自加操作时候的汇编代码00401063 mov ecx,dword ptr g_nValue (00427c48)00401069 add ecx,10040106C mov dword ptr g_nValue (00427c48),ecx00401072 jmp TestProc1+21h (00401051)ecx = g_nValue;ecx = ecx + 1 ;g_nValue = ecx ;线程A 1.-时间片到 将ec

12、x压站保护 ecx = 1;3.-g_nValue = 1;线程B 2.-时间片到 g_nValue等于1执行顺序 1. 3. 2原子锁就能够解决这个问题- 原子锁的使用原子锁对单条指令的操作。每一个运算符 都有一个原子锁函数API InterlockedIncrement 内存数据加函数(自加原子锁) InterlockedDecrement 内存数据减函数(自减原子锁) InterlockedCompareExchange a=3时 a=3 InterlockedExchange 赋值 .原子锁的实现: 直接对数据所在的内存操作,并且在任何一个瞬间只能有一个线程访问。2.临界区 相关问题

13、day / WinThread printf输出混乱,多线程情况下同时使用一段代码。 临界区可以锁定一段代码,防止多个线程同时使用该段代码使用 WinCritical (完全可以替代原子锁的使用)1 初始化一个临界区 (初始化临界区变量) VOID InitializeCriticalSection( LPCRITICAL_SECTION lpCriticalSection /临界区变量2 进入临界区 添加到被锁定的代码之前 VOID EnterCriticalSection( LPCRITICAL_SECTION lpCriticalSection / critical section结构体

14、指针3 离开临界区 添加到被锁定的代码之后 VOID LeaveCriticalSection( LPCRITICAL_SECTION lpCriticalSection / critical section4 删除临近区 VOID DeleteCriticalSection(第一、四步 都用在主线程中第二、三步 都用在子线程(需要上锁的代码段)中 原子锁和临界区原子锁 - 单条指令。临界区 - 单条或多行代码。原子锁锁定单独指令 临界区是范围锁定()3.事件(多个子进程之间通知问题)相关问题 WinEvent 程序之间的通知的问题。 事件的使用1 创建事件HANDLE CreateEvent

15、( LPSECURITY_ATTRIBUTES lpEventAttributes, /安全属性 BOOL bManualReset, /事件重置方式,TRUE手动,FALSE自动 BOOL bInitialState, /事件初始状态,TRUE有信号 LPCTSTR lpName /事件命名 创建成功返回 事件句柄事件重置方式或复位 : 从有信号变成无信号2 等候事件 WaitForSingleObject/ WaitForMultipleObjects3 触发事件 将事件设置成有信号状态 BOOL SetEvent( HANDLE hEvent / handle to event 事件句柄

16、 将事件设置成无信号状态 BOOL ResetEvent( 复位事件 HANDLE hEvent / handle to event4 关闭事件 CloseHandle小心事件的死锁。4.互斥 Mutex 相关的问题 WinMutex 多线程下代码或资源的共享使用。互斥的使用 1 创建互斥 HANDLE CreateMutex( LPSECURITY_ATTRIBUTES lpMutexAttributes, /安全属性 BOOL bInitialOwner,/初始的拥有者 LPCTSTR lpName /命名 创建成功返回互斥句柄 bInitialOwner - 初始的拥有者互斥的游离状态表

17、示有信号,线程得到后就处于无信号状态 TRUE - 调用CreateMutex的线程拥有互斥 FALSE - 创建的时没有线程拥有互斥2 等候互斥 WaitFor. 互斥的等候遵循谁先等候谁先获取。 互斥游离时候没有堵塞,某个线程拿到互斥后,互斥变为无信号状态,进入堵塞阶段,当拥有该互斥的线程释放了互斥后,应用进程才继续进行,哪个线程先进入堵塞(类似排队),哪个线程就得到新的游离互斥,重新进入堵塞状态3 释放互斥 BOOL ReleaseMutex( HANDLE hMutex / handle to mutex4 关闭互斥句柄互斥和临界区的区别临界区 - 用户态,执行效率高,只能在同一个进程

18、中使用。互 斥 - 内核态,执行效率低,可以通过命名的方式跨进程使用。5.信号量相关的问题 类似于事件,解决通知的相关问题。但是可以提供一个计数器,可以设置次数。信号量的使用 1 创建 信号量 HANDLE CreateSemaphore( LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, LONG lInitialCount, /初始化信号量数量 (3) LONG lMaximumCount, /信号量的最大值 (10) LPCTSTR lpName /命名 创建成功返回信号量句柄2 等候信号量 WaitFor. (第一次碰到的时候不会阻塞,计数3变成

19、2,每遇到一个信号计数就会递减,都不会阻塞,当计数为0之后,就都会阻塞) 等候每通过一次,信号量的信号减1,直到为0阻塞3 释放信号量 BOOL ReleaseSemaphore( (重新给信号量一个计数值) HANDLE hSemaphore, /信号量句柄(给哪个信号一个新的值) LONG lReleaseCount, /释放数量 (重新赋的值) LPLONG lpPreviousCount /释放前原来信号量的数量,可以为NULL4 关闭句柄6.可等候计时器(略) .相关问题 按指定的间隔时间通知程序精度高(纳秒级,以100纳秒为单位,只适用于第一次启动时间,间隔时间仍然是以毫秒为单位)

20、准度好(不走队列,不需要getmessage抓取消息)可等候计时器的使用1.创建可等候计时器 HANDLE CreateWaitableTimer( LPSECURITY_ATTRIBUTES lpTimerAttributes, / SD安全属性没默认为null BOOL bManualReset, / reset type 复位方式,TRUE-手动,FALSE 自动 LPCTSTR lpTimerName / object name 命名。可以为null、函数执行成功,返回可等候定时器句柄2.设置可等候计时器(启动时间,间隔时间) Setwaitabletimer BOOL SetWait

21、ableTimer( HANDLE hTimer, / handle to timer 定时器句柄 const LARGE_INTEGER *pDueTime, / timer due time (代表六十四位结构体)第一次启动时间 LONG lPeriod, / timer interval 间隔时间(毫秒) PTIMERAPCROUTINE pfnCompletionRoutine, / completion routine APC回调函数(自己定义,定时时间到,则调用) LPVOID lpArgToCompletionRoutine, / completion routine parameter APC回调函数的参数 BOOL fResume / resume state 待机处理标识(TRUE、false)pDuTime - 正数 - 绝对时间,具体系统时间(年月日分秒) 负数 - 相对时间,和单签时间的时间差 lPeriod 单位为毫秒,如果为0,可等候定时器只执行一次。 fResume TRUE - 时间到了,唤醒机器,继续运行 False - 取消通知,不唤醒,继续待机3.等候 WaitFor4.关闭可等候定时器句柄

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2