实验4 windows线程互斥同步

上传人:mg****85 文档编号:36903611 上传时间:2018-04-04 格式:DOC 页数:16 大小:176KB
返回 下载 相关 举报
实验4 windows线程互斥同步_第1页
第1页 / 共16页
实验4 windows线程互斥同步_第2页
第2页 / 共16页
实验4 windows线程互斥同步_第3页
第3页 / 共16页
实验4 windows线程互斥同步_第4页
第4页 / 共16页
实验4 windows线程互斥同步_第5页
第5页 / 共16页
点击查看更多>>
资源描述

《实验4 windows线程互斥同步》由会员分享,可在线阅读,更多相关《实验4 windows线程互斥同步(16页珍藏版)》请在金锄头文库上搜索。

1、实验实验 5 Windows 线程互斥同步线程互斥同步目录 实验目的.2 预备知识.2 一、Windows 线程同步机制(注:互斥是同步的一种特例).2 二、Windows 多线程编程.3 三、VC+(略) .3 要用到的系统调用.3 实验内容.3 一、用 Win32 API 实现线程的创建、挂起、恢复、终止.3 二、Windows 线程同步(含互斥).5 1、用全局变量来进行同一进程的线程间同步.5 2、用事件(Event)对象来进行线程同步.6 3、用临界区(Critical Section)来进行线程互斥.8 4、用互斥量(Mutex)来进行线程互斥.10 5、用信号量(Semaphor

2、e)来实现线程同步.13 三、用 MFC 实现多线程同步.15 四、.NET Framework 多线程的同步 .16实验目的实验目的1、了解 Windows 内核对线程同步的支持。 2、了解 C 的线程函数库及 Windows 基本的线程 API 函数的使用。 3、进一步理解线程的同步控制原理。预备知识预备知识一、一、Windows 线程同步机制(注:互斥是同步的一种特例)线程同步机制(注:互斥是同步的一种特例)1.进程,Processes 2.线程,Threads 3.文件,Files 4.控制台输入,Console input 5.文件变化通知,File change notificat

3、ions 6.互斥量,Mutexes 7.信号量,Semaphores 8.事件(自动重设事件和手动重设事件),Events 9.可等的计时器,Waitable timers以上类型的对象属于内核对象,每一个上面这些类型的对象都可以处于两种状态之一: 有信号(signaled)和无信号(nonsignaled) 。比如进程和线程在终结时其内核对象变为 有信号,而在它们处于创建和正在运行时,其内核对象是无信号的。因此可用于同步。 此外还有全局变量、临界区可用于线程同步。下面讲 5 种。全局变量 事件(Event)-属于内核对象,有句柄,可跨进城 临界区(Critical Section) 互斥量

4、(Mutex)-属于内核对象,有句柄,可跨进城 信号量(Semaphore)-属于内核对象,有句柄,可跨进城 1、是否能跨进城使用?、是否能跨进城使用? 互斥量、信号量、事件都可以跨进程来实现同步数据操作。 临界区只能用在同一进城的线程间互斥,因为临界区无名(无句柄) 。如果只为了在进程内 部用的话,使用临界区会带来速度上的优势并能够减少资源占用量。 2、其它区别、其它区别临界区:访问临界资源的代码段。课堂上讲过。 (存钱、取钱的例子还记得吗?) 互斥量:资源独占使用 信号量:资源计数器 事件对象:可以通过“通知”的方式来保持线程的同步。事件是 WIN32 中最灵活的线程间 同步机制。事件存在

5、两种状态:激发状态(Signaled or True)未激发状态(Unsignaled or False)。二、二、Windows 多线程编程多线程编程Win32 API 是 Windows 操作系统为内核以及应用程序之间提供的接口,将内核提 供的功能进行函数封装,应用程序通过调用相关的函数获得相应的系统功能。 MFC 是微软基础函数类库(Microsoft Foundation Classes),由微软提供的,用类库的 方式将 Win32 API 进行封装, 以类的方式提供给开发者。 .NET Framework 由两部分构成:公共语言运行库 (Common Language Runtime

6、 ,CLR)和 Framework 类库 (Framework Class Library ,FCL) 。.NET 基础类库的 System.Threading 命名空间 提供了大量的类和接口来支持多线程。所有与多线程机制相关的类都存放在 System.Threading 命名空间中。三、三、VC+(略)(略)要用到的系统调用要用到的系统调用见每个程序前的说明实验内容实验内容实验内容一、用一、用 Win32 API 实现线程的创建、挂起、恢复、终止实现线程的创建、挂起、恢复、终止4 个函数原型如下,它们的头文件都是 windows.h HANDLE CreateThread( /该函数创建线程

7、,返回新线程的句柄LPSECURITY_ATTRIBUTES lpThreadAttributes, /指向线程属性结构的指针DWORD dwStackSize, /初始栈的大小,如果为 0,那么默认与调用该函数的线程相同 的栈空间大小LPTHREAD_START_ROUTINE lpStartAddress, /代码地址LPVOID lpParameter, /传递给线程的参数DWORD dwCreationFlags, /初始状态,4 为挂起,0 为就绪 LPDWORD lpThreadId); /地址,用来保存新线程的 id说明:在用 c/c+时,最好不要用 CreateThread 函

8、数,不安全。应该使用 Visual C+运 行期库函数_beginthread 或_beginthreadex。我们的第一个程序用 CreateThread 函数来创建 线程,后边的例子若非必要,都用_beginthread。DWORD WINAPI ResumeThread(HANDLE 线程句柄);/恢复激活线程 DWORD WINAPI SuspendThread(HANDLE 线程句柄);/挂起线程(阻塞) BOOL TerminateThread(HANDLE 线程句柄, DWORD 退出码);/强行让指定的线程终止。 慎用。应该让那个线程运行结束自动终止,或者让那个线程调用 Exi

9、tThread()新建一个控制台程序,新建一个空白 c+文件,复制下列代码: #include #include DWORD WINAPI fun1(LPVOID param) while(1) Sleep(1000);/注意字母 S 大写 printf(“This is fun1n“); return 1; DWORD WINAPI Fun2(LPVOID param) while(1) Sleep(1000); printf(“This is fun2n“); return 1; int main() DWORD pid1 = 0, pid2 = 0; HANDLE h1 = Create

10、Thread(NULL,0,fun1,NULL, CREATE_SUSPENDED, HANDLE h2 = CreateThread(NULL,0,Fun2,NULL,CREATE_SUSPENDED, printf(“主线程的 id 号是%d,两个线程的 id 号分别是%d,%dn“,GetCurrentThreadId(), pid1,pid2); system(“pause“);/主线程运行 DOS 命令 pause printf(“你按任意键后,两个线程将被恢复n“); ResumeThread(h1);ResumeThread(h2); system(“pause“); print

11、f(“你按任意键后,线程 h1 将被挂起n“); SuspendThread(h1); system(“pause“); printf(“你按任意键后,线程 h1 将被恢复,线程 h2 将被终止n“); ResumeThread(h1); TerminateThread(h2,1); system(“pause“); CloseHandle(h1); CloseHandle(h2); return 0; 验证 1:读程序,看结果,分析每个函数的作用 验证 2:改变 Sleep()内的休眠时间,比如改为 200 毫秒,或 2000 毫秒 验证 3:CreateThread 函数内的参数 CREATE_SUSPENDED 是常量 4,表示线程创建后的 初始状态为挂起。将其改为 0,表示初始状态是就绪。二、二、Windows 线程同步(含互斥)线程同步(含互斥)1、用全局变量来进行同一进程的线程间同步、用全局变量来进行同一进程的线程间同步同一进程中的所有线程都可以访问所有的全局变量,全局变量成为 win32 多线程通信 的最简单方式。 #includ

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号