Windows多线程编程及调试.ppt

上传人:za****8 文档编号:20686634 上传时间:2021-04-13 格式:PPT 页数:40 大小:188.50KB
返回 下载 相关 举报
Windows多线程编程及调试.ppt_第1页
第1页 / 共40页
Windows多线程编程及调试.ppt_第2页
第2页 / 共40页
Windows多线程编程及调试.ppt_第3页
第3页 / 共40页
点击查看更多>>
资源描述
Windows多线程编程及调优 Win32 API是 Windows操作系统为内核以及应用程序 之间提供的接口,将内核提供的功能进行函数封装, 应用程序通过调用相关的函数获得相应的系统功能。 MFC是微软基础函数类库 (Microsoft Foundation Classes),由微软提供的,用类库的方式将 Win32 API 进行封装 , 以类的方式提供给开发者。 .NET Framework 由两部分构成:公共语言运行库 ( Common Language Runtime , CLR)和 Framework 类库( Framework Class Library , FCL)。 .NET 基 础类库的 System.Threading命名空间提供了大量的类 和接口来支持多线程。所有与多线程机制相关的类 都存放在 System.Threading命名空间中。 使用 Win32线程 API Win32函数库中提供了操作多线程的函数,包括创建 线程、管理线程、终止线程、线程同步等接口。 线程函数: DWORD WINAPI ThreadFunc (LPVOID lpvThreadParm) 线程创建 HANDLE CreateThread ( LPSECURITY_ATTRIBUTES lpThreadAttributes, SIZE_T dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId ); CreateThread不会执行 C运行时数据块, 因此在 C运 行时库的应用程序中,不能使 CreateThread创建线程, 微软提供了另外的创建方法:创建线程用 process.h 头文件中声明的 c执行时期链接库函数 _beginthread 函数, uintptr_t _beginthread( void( *start_address )( void * ), unsigned stack_size, void *arglist ); 使用 Win32线程 API 线程管理 控制和操作线程(管理), Windows允许对创建的线程进 行挂起或运行操作,进入相应的状态。线程中的每个线程 都有挂起计数器,当挂起计数器为 0时,线程被执行,当 挂起计数器值大于 0时,调度器不去调度该线程 。 不能够直接访问现成的挂起计数器,可以通过调用 API函数来改变它的值,两个函数: DWORD SuspendThread(HANDLE hThread) :挂起操作, 如果函数执行成功,线程中止执行,调用一次,线程挂起 计数器值增 1 ; DWORD ResumeThread(HANDLE hThread) :用于结束线 程的挂起状态操作,每次调用该函数,线程挂起计数器值 减 1,若挂起计数器值为 0,则不会再减。 线程等待 Win32 API提供了一组能使线程阻塞其自身执行的等待函 数 WaitForSingleObject、 WaitForMultipleObject。这些 函数在其参数中的一个或多个同步对象中产生了信号,或 者在超过规定的时间才返回。在等待函数未返回时,线程 处于等待状态,线程不消耗 CPU时间 . 线程终结 线程函数返回时,线程自动终止,如果需要在线程的执行 过程中终止则可调用 ExitThread函数。如果在线程之外终 止线程,可以调用 TerminateThread函数。 线程同步的实现 在 Win32中,同步的机制主要有以下几种: 全局变量 事件 (Event) 临界区 (Critical section) 互斥量 (Mutex) 信号量 (Semaphore) 全局变量 进程中的所有线程都可以访问所有的全局变量,全局变量 成为 win32多线程通信的最简单方式 事件 (Event) 事件 (Event) Win32提供的最灵活的线程间同步方式 . 事件存在两种状态: 激发状态 ; 未激发状态 . 创建事件函数原型 : HANDLE CreateEvent( LPSECURITY_ATTRIBUTES lpEventAttributes, BOOL bManualReset, BOOL bInitialState, LPCTSTR lpName ); 事件 (Event) 事件设置分类: 手动设置:这种对象只能用程序来手动设置,在需要该事 件或者事件发生时,采用 SetEvent及 ResetEvent来进行设置。 SetEvent只有一个参数,该参数指定了时间对象的句柄值,若事件 成功激发,返回 TRUE; ResetEvent函数将事件对象恢复到最初的非激发状态,只有一个参 数,成功后返回真 . 自动恢复:一旦事件发生并被处理后,将自动恢复到没有 事件状态,因此不需要再次设置。 事件机制应用实例 : 有三个线程:主、读、写。读线程必须在写线程完成写操 作之后进行读操作,主线程必须在读线程进行完读操作之 后才结束 . 临界区 临界区:防止多个线程同时执行一个特定代码段的 机制,适用于多个线程操作之间没有先后顺序但要 求互斥的同步。 多个线程访问同一个临界区的原则: 一次最多只能一个线程停留在临界区内; 不能让一个线程无限地停留在临界区内,否则其他线程将 不能进入该临界区。 临界区变量定义方法: CRITICAL_SECTION gCritical_Section;(全局 ) 临界区 相关的 API : 初始化临界区 InitializeCriticalSection( 删除临界区 DeleteCriticalSection( 进入临界区 EnterCriticalSection( 离开临界区 LeaveCriticalSection( 临界区同步机制实例: 例如一个银行系统有两个线程执行取款任务,一个使用存 折在柜台取款,另一个使用银行卡在 ATM机上取款。若 不加控制,很可能帐户余额不足于两次取款的总额,但还 是能把款取走。如: 100元被取走 110元。 互斥量 互斥量:协调多个线程的活动,通过锁定和取消锁定资源, 控制对共享资源的访问。作用就是保证每次只能有一个线程 获得互斥量,解锁互斥量的线程一定也是对其加锁的线程。 创建函数: HANDLE CreateMutex( LPSECURITY_ATTRIBUTES lpMutexAttributes, BOOL bInitialOwner, LPCTSTR lpName ); 相关的 API操作如下: CreateMutex创建一个互斥量,返回对象句柄 OpenMutex打开并返回一个已存在的互斥对象句柄,使之后续访问。 ReleaseMutex释放对互斥量的占用,使之成为可用。 信号量 信号量是一个核心对象,拥有一个计数器,可用来 管理大量有限的系统资源,当计数器大于 0时,信号 量为有信号状态,当计数值为 0时,信号量就处于无 信号状态。 创建信号量 HANDLE CreateSemaphore( LPSECURITY_ATTRIBUTES lpSA, LONG lInitialCount, LONG lMaximumCount, LPCTSTR lpName ); 信号量 释放信号量 BOOL ReleaseSemaphore( HANDLE hSemaphore, LONG lReleaseCount, LPLONG lpPreviousCount ); 打开信号量 HANDLE OpenSemaphore( DWORD dwDesiredAccess, BOOL bInheritHandle, LPCTSTR lpName ); MFC线程同步实现 MFC通过全局函数 afxBeginThread() 来创建一个 CWinThread对象。 MFC同步类 CCriticalSection 只允许当前进程中的一个线程访问某个对 象的同步类 CMutes 只允许系统中一个进程内的一个线程访问某个对 象的同步类 CSymaphore 只允许一到某个指定数目个线程同时访问某 个对象的同步类 CEvent 当某个事件发生时通知一个应用程序的同步类 MFC线程同步实现 实例:创建 MFC AppWizard Exe工程,对 4个数组排序 后,通过信号量同步机制,依次显示每个数组经过 排序后的输出。 HANDLE g_hBusy; HWND hwnd; int k=0; long data1 = 12,32,47,763,75,43,86,42; long data2 = 432,68,36,84,47,73,732,46; long data3 = 435,754,37,765,48,785,326,78; long data4 = 54,76,93,457,456,34,94,50; .NET Framework多线程的实现 创建辅助(或从属)线程的第一个步骤是创建 ThreadStart 代理,指定要由该线程执行的线程函数。 然后将 ThreadStart 代理传递给 Thread 类的构造函数。 ThreadStart starter = new ThreadStart(MyFunction); Thread t = new Thread(starter); t.Start(); 线程创建好后,可以使用 Thread类下的方法对线程进行控制: Resume 继续已挂起的线程。 Sleep 将当前线程阻塞指定的毫秒数。 Suspend 挂起线程。 Abort 调用此方法通常会终止线程。 .NET框架下同步机制实现 .NET framework提供了很多的类和数据类型来控制 对共享资源的访问。 Monitor类 WaitHandle类 Mutex类 AutoResetEvent类 InterLocked类 lock 关键字将语句块标记为临界区,方法是获取给 定对象的互斥锁,执行语句,然后释放该锁。此语 句的形式如下: Object thisLock = new Object(); lock (thisLock) / Critical code section
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!