线程的实现和线程间的同步与互斥.doc_第1页
线程的实现和线程间的同步与互斥.doc_第2页
线程的实现和线程间的同步与互斥.doc_第3页
线程的实现和线程间的同步与互斥.doc_第4页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

实验二 线程的实现和线程间的同步与互斥一、目的:1、了解在WINDOWS中线程的编程实现,掌握利用VC或DELPHI调用WINDOWS API建立线程。2、了解在WINDOWS中线程间同步与互斥的信号量的实现,并利用该原理实现在WINDOWS下模拟实现有关经典线程同步与互斥问题。二、内容:1、利用VC或DELPHI在实际程序中实现线程。2、利用VC或DELPHI实现线程的同步模拟。主要模拟以下问题(经营者和消费者、阅读者和写入者)。三、实验要求:实验内容中的第1小题为必作内容,第2小题可选择其一。四、实验提示:1、 在Windows中调用API函数。对于VC,在程序头文件应包括#include 语句。对于DELPHI,在程序前的USES中应包括Windows。2、 Windows系统中的线程及有关的系统调用。Windows中的线程是内核线程,是系统的主要调度单位,提供了一系列的系统调用。CreateThread完成线程的创建,TerminateThread用于结束当前线程。SuspendThread可挂起指定的线程。ResumeThread可激活指定的线程。对于Windows来说,是用挂起计数来进行线程挂起和激活的计数的。每调用挂起一次,计数加1,反之则减1。当计数为0时,线程恢复运行。四个调用的原型及简单说明如下。(1)、CreateThread创建线程HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes,/指向安全属性结构的指针,一般为NULL。 DWORD dwStackSize,/ 初始化线程的堆栈尺寸,一般为0。 LPTHREAD_START_ROUTINE lpStartAddress,/ 指向线程执行体的指针。 LPVOID lpParameter,/ 新线程的参数 DWORD dwCreationFlags,/ 建立标志位,0:创建后立即执行,1:创建后挂起。 LPDWORD lpThreadId / 指向返回标识符的指针。 )(2)、SuspendThread挂起指定的线程DWORD SuspendThread( HANDLE hThread / 线程句柄 )(3)、ResumeThread激活指定的线程DWORD ResumeThread( HANDLE hThread / 线程句柄 )(4)、TerminateThread结束线程BOOL TerminateThread( HANDLE hThread,/ 线程句柄 DWORD dwExitCode / 线程的结束代码。一般为0。 )3、 Windows中的同步机制及相关调用。在Windows中提供了互斥对象、信号量对象和事件对象三种同步对象和相应的系统调用,用于进程和线程的同步。另外还提供了临界区(Critical Section)对象和互斥变量访问API等。在这里,我们主要对互斥对象和信号量对象进行简单介绍。互斥对象(Mutex)为互斥信号量,它的相关API为:Createmutex创建一个互斥信号量,Openmutex打开一个互斥信号量,Releasemutex释放一个互斥信号量,使之可用,相当于Signal操作。信号量对象(Semaphore)为资源信号量,它的相关API为:CreateSemaphore创建一个信号量对象,OpenSemaphore打开一个信号量对象,ReleaseSemaphore释放一个信号对象。系统中统一的等待操作WaitForSingleObject,相当于Wait操作。七个调用的原型和简单说明如下:(1)、Createmutex创建互斥信号量HANDLE CreateMutex( LPSECURITY_ATTRIBUTES lpMutexAttributes,/ 指向安全属性的指针,一般为NULL BOOL bInitialOwner,/ 初始化时所有权的标志位,TRUE:创建时即拥有,FALSE:创建时不拥有。 LPCTSTR lpName / 互斥信号量的名称 )(2)、Openmutex打开互斥信号量HANDLE OpenMutex( DWORD dwDesiredAccess,/ 操作标志位,一般为MUTEX_ALL_ACCESS BOOL bInheritHandle,/ 继承标志位,一般为FALSE LPCTSTR lpName / 互斥信号量的名称 )(3)、Releasemutex释放互斥信号量BOOL ReleaseMutex( HANDLE hMutex / 互斥信号量的句柄 )(4)、CreateSemaphore创建信号量对象HANDLE CreateSemaphore( LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,/ 指向安全属性的指针,一般为NULL。 LONG lInitialCount,/ 信号量的初始化值。 LONG lMaximumCount,/ 信号量的最大值 LPCTSTR lpName / 信号量名称 )(5)、OpenSemaphore打开一个信号量对象HANDLE OpenSemaphore( DWORD dwDesiredAccess,/操作标志位,一般为SEMAPHORE_ALL_ACCESS BOOL bInheritHandle,/继承标志位,一般为FALSE LPCTSTR lpName / 信号量对象名称 )(6)、ReleaseSemaphore释放信号对象BOOL ReleaseSemaphore( HANDLE hSemaphore,/ 信号对象句柄 LONG lReleaseCount,/释放的个数 LPLONG lpPreviousCount / 前一个计数的地址,一般为NULL )(7)、WaitForSingleObject等待操作DWORD WaitForSingleObject( HANDLE hHandle,/ 等待的信号量的句柄 DWORD dwMilliseconds / 等待的时间,以毫秒为单位,如果永久等待,则为INFINITE )4、 一个简单的线程创建、挂起和解挂的例子。#include #include #include #include void SubThread(void)int i;for (i=0;i5;i+)cout SubThread i endl;Sleep(2000);void main(void) cout CreateThread endl;/ 创建一个线程DWORD IDThread; /返回的线程标示符 HANDLE hThread;/线程句柄hThread = CreateThread(NULL, 0,(LPTHREAD_START_ROUTINE) SubThread, NULL, 0, &IDThread); / 检查操作是否成功 if (hThread = NULL)cout CreateThread error endl; int i;for (i=0;i5;i+)cout MainThread i endl;if (i=1)if (SuspendThread(hThread)=0xFFFFFFFF)cout Suspend thread error. endl;elsecout Suspend thread is ok. endl;if (i=3)if (ResumeThread(hThread)=0xFFFFFFFF)cout Resume thread error. endl;elsecout Resume thread is ok. endl;Sleep(4000);5、 一个简单的互斥信号量使用的例子。#include #include #include #include int iCounter=0;viod threadA(viod)/在内部重新打开HANDLE hCounterIn=OpenMutex(MUTEX_ALL_ACCESS,FALSE,spmetex);for(int i=0;i8;i+)cout Wait for object. endl;WaitForSingleObject(hCounterIn,INFINITE);int iCopy=iCounter;Sleep(100);iCounter=iCopy+1;cout Count is iCounter endl;ReleaseMutex(hCounterIn);CloseHandle(hCounterIn);/主程序/创建互斥量HANDLE hCounter=NULL;hCounter = CreateMutex(NULL,FALSE,spmutex);/创建线程HANDLE hThread3;DWORD IDThread3; /返回的线程标示符HThread0 = CreateThread(NULL, 0,(LPTHREAD_START_ROUTINE) ThreadA, NULL, 0, &IDThread0); HThread1 = CreateThread(NULL, 0,(LPTHREAD_START_ROUTINE) ThreadA, NULL, 0, &IDThread1);HThread2 = CreateThread(NULL, 0,(LPTHREAD_START_ROUTINE) Sub

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论