实验2-2windows2000 线程同步
windows的多线程同步实验报告
一、实验目的在掌握基于消息的windows程序结构和多线程程序设计方法的基础上,设计一个多线程同步的程序。
使学生能够从程序设计的角度了解多线程程序设计的方法和在windows系统下多线程同步互斥的机制。
二、实验内容1.理解Windows程序设计的基本思想,理解基于消息的程序设计方法,能够设计出简单的基于事件的windows程序,完成基本控件的使用2.结合操作系统中信号量与互斥体的概念,在MFC中找到对应的相关类3.设计一个多线程同步的程序,多线程概述进程和线程都是操作系统的概念。
进程是应用程序的执行实例,每个进程是由私有的虚拟地址空间、代码、数据和其它各种系统资源组成,进程在运行过程中创建的资源随着进程的终止而被销毁,所使用的系统资源在进程终止时被释放或关闭。
线程是进程内部的一个执行单元。
系统创建好进程后,实际上就启动执行了该进程的主执行线程,主执行线程以函数地址形式,比如说main或WinMain函数,将程序的启动点提供给Windows系统。
主执行线程终止了,进程也就随之终止。
每一个进程至少有一个主执行线程,它无需由用户去主动创建,是由系统自动创建的。
用户根据需要在应用程序中创建其它线程,多个线程并发地运行于同一个进程中。
一个进程中的所有线程都在该进程的虚拟地址空间中,共同使用这些虚拟地址空间、全局变量和系统资源,所以线程间的通讯非常方便,多线程技术的应用也较为广泛。
多线程可以实现并行处理,避免了某项任务长时间占用CPU时间。
要说明的一点是,目前大多数的计算机都是单处理器(CPU)的,为了运行所有这些线程,操作系统为每个独立线程安排一些CPU时间,操作系统以轮换方式向线程提供时间片,这就给人一种假象,好象这些线程都在同时运行。
由此可见,如果两个非常活跃的线程为了抢夺对CPU的控制权,在线程切换时会消耗很多的CPU资源,反而会降低系统的性能。
这一点在多线程编程时应该注意。
Win32 SDK函数支持进行多线程的程序设计,并提供了操作系统原理中的各种同步、互斥和临界区等操作。
操作系统实验线程同步
实验2:线程同步一、实验目的(1)掌握Windows2000环境下,线程同步。
(2)熟悉Windows2000提供的线程同步与互斥API。
(3)用Windows2000提供的线程同步与互斥API解决实际问题(producer-consumer)。
二、实验内容生产者与消费者问题的实现。
在Windows 2000环境下,创建一组“生产者”线程和一组“消费者”线程,并建立一个长度为N的全局数组作为共享缓冲区。
“生产者”向缓冲区输入数据,“消费者”从缓冲区读出数据。
当缓冲区满时,“生产者”必须阻塞,等待“消费者”取走缓冲区数据后将其唤醒。
当缓冲区空时,“消费者”阻塞,等待“生产者”生产了产品后将其唤醒。
试用信号量实现“生产者”与“消费者”线程之间的同步。
三、实验环境(1)使用的操作系统及版本。
Windows xp professional(2)使用的编译系统及版本。
Visual c++ 6.0四、实验步骤1.等待一个对象(相当于p操作)WaitForSingleObject用于等待一个对象。
它等待的对象可以为:Change notification:变化通知。
Console input:控制台输入。
Event:事件。
Job:作业。
Mutex:互斥信号量。
Process:进程。
Semaphore:计数信号量。
Thread:线程。
Waitable timer:定时器。
返回值:如果成功返回,其返回值说明是何种事件导致函数返回。
访问描述WAIT_ABANDONED 等待的对象是一个互斥(mutex)对象,该互斥对象没有被拥有它的线程释放,它被设置为不能被唤醒。
WAIT_OBJECT_0 指定对象被唤醒。
WAIT_TIMEOUT 超时。
2.创建信号量CreateSemaphore用于创建一个信号量。
返回值:信号量创建成功,将返回该信号量的句柄。
如果给出的信号量名是系统已经存在的信号量,将返回这个已存在信号量的句柄。
操作系统线程同步机制实验报告
操作系统线程同步机制实验报告一、实验名称:线程同步机制二、实验内容及目的:2.1、通过观察共享数据资源但不受控制的两个线程的并发运行输出结果,体会同步机制的必要性和重要性;2.2、利用现有操作系统提供的同步机制编程实现两线程的有序控制;2.3、根据同步机制的Peterson软件解决方案编程实现同步机制对于同一问题的解决;2。
4、基于程序运行时间长短比较两种同步机制。
三、实验步骤:3.1、编程实现不设置任何线程同步机制的多线程银行转账程序,观察输出结果。
3。
1。
1、主要代码(完整代码见附录)://nAccount1与nAccount2为全局变量,也是此线程同步机制里的临界变量.do{nTemp1 = nAccount1;nTemp2 = nAccount2;nRandom = rand();nAccount1 = nTemp1 + nRandom;nAccount2 = nTemp2 - nRandom;nLoop++;} while ((nAccount1 + nAccount2) == 0);3.1.2、输出结果:当没有任何线程同步机制时,程序循环不了多少次便跳了出来,某一次的输出结果如下图:图一无线程同步机制时的程序运行结果3.2、编程实现调用系统Mutex的多线程银行转账程序,观察输出结果。
3。
2.1、:主要代码(完整代码见附录):do{::WaitForSingleObject(m1,INFINITE);nTemp1 = nAccount1;nTemp2 = nAccount2;nRandom = rand();nAccount1 = nTemp1 + nRandom;nAccount2 = nTemp2 - nRandom;if((nAccount1 + nAccount2) != 0)break;::ReleaseMutex(m1);nLoop++;} while (nLoop 〈= 1000000);为了防止程序陷入死循环,在while条件里加上了nloop〈=1000000,当循环执行到第1000001时将跳出。
操作系统实验二并发与调度
实验二并发与调度一、实验目的在本实验中,通过对事件和互斥体对象的了解,来加深对Windows 2000线程同步的理解。
通过分析实验程序,了解管理事件对象的API。
了解在进程中如何使用事件对象,在进程中如何使用互斥体对象,线程如何通过文件映射对象发送数据。
二、实验环境硬件环境:计算机一台,局域网环境;软件环境:Windows 2000 Professional,Visual C++ 6.0专业版或企业版。
三、实验内容和步骤第一部分:互斥体对象本程序中显示的类CCountUpDown使用了一个互斥体来保证对两个线程间单一数值的访问。
每个线程都企图获得控制权来改变该数值,然后将该数值写入输出流中。
创建者实际上创建的是互斥体对象,计数方法执行等待并释放,为的是共同使用互斥体所需的资源(因而也就是共享资源) 。
1、利用互斥体保护共享资源程序参见实验指导书分析程序的运行结果,可以看到线程(加和减线程) 的交替执行(因为Sleep() API允许Windows切换线程) 。
在每次运行之后,数值应该返回初始值(0) ,因为在每次运行之后写入线程在等待队列中变成最后一个,内核保证它在其他线程工作时不会再运行。
1)请描述运行结果(如果运行不成功,则可能的原因是什么?) :2) 根据运行输出结果,对照分析程序,可以看出程序运行的流程吗?请简单描述:_____逆向运行__________第二部分线程通过文件对象发送数据Windows 2000提供的线程间通讯类内核对象允许同一进程或跨进程的线程之间互相发送信息,包括文件、文件映射、邮件位和命名管道等,其中最常用的是文件和文件映射。
这类对象允许一个线程很容易地向同一进程或其他进程中的另一线程发送信息。
1、演示线程通过文件对象发送数据程序参见实验指导书运行结果(如果运行不成功,则可能的原因是什么?) :阅读和分析程序,请回答问题:1) 程序中启动了多少个单独的读写线程?__________100__________________________________________________________2) 使用了哪个系统API函数来创建线程例程?_________ CreateThread()________________________________3) 文件的读和写操作分别使用了哪个API函数?_______ ReadFile()______ WriteFile()_____________ 每次运行进程时,都可看到程序中的每个线程从前面的线程中读取数据并将数据增加,文件中的数值连续增加。
Windows中的线程与线程同步现象实验报告
信息工程学院实验报告课程名称:操作系统Array实验项目名称: Windows中的线程与线程同步现象一、实验目的:1、掌握Windows中线程的操作。
2、熟悉线程不同步时的现象及环境因素。
3、掌握一种同步对象的使用。
二、实验设备与器件(填写使用的计算机配置、操作系统等实验所需的软硬件环境)Visual C++三、实验内容与步骤1、定义全局变量int i = 0; 初始值置为0。
2、创建两个线程,一个对i 执行加1 操作,另一个对i 执行减1 操作。
两个线程执行相同的次数。
显然,正常情况下,i 的值仍然保持为0。
#include <stdio.h>#include <windows.h>#define MaxCount 9000000DWORD __stdcall fun1( LPVOID p1){for( int j =0 ;j < MaxCount;j++){i++;}return 0;}DWORD __stdcall fun2( LPVOID p1){for( int j =0 ;j < MaxCount;j++){i--;}return 0;}3、观察两个线程执行后的情况,可以发觉最后i 的值不一定是0,有时是很大的正数,有时是很大的负数,这就是多个线程在操作同一个变量i时,未同步时带来的严重问题。
因此,多个线程操作共享的变量时,需要考虑同步问题。
给这两个线程加上同步代码,再来观察对 i 值的影响。
只要对步骤2的函数稍微改动即可:CRITICAL_SECTION cs;DWORD __stdcall fun1( LPVOID p1){for( int j =0 ;j < MaxCount;j++){::EnterCriticalSection(&cs);i++;::LeaveCriticalSection(&cs);}}DWORD __stdcall fun2( LPVOID p1){for( int j =0 ;j < MaxCount;j++){::EnterCriticalSection(&cs);i--;::LeaveCriticalSection(&cs);}}加入同步代码的两个线程,无论如何执行,i 的值总是 0 ,结果是正确的。
操作系统实验报告—Windows线程同步机制
2012-2013学年第一学期计算机操作系统实验报告专业:班级:学号:姓名:提交日期:Windows线程同步机制【开发语言及实现平台或实验环境】C++/C#Microsoft Visual Studio 6.0/ Microsoft Visual Studio .NET【实验目的】(1) 了解Windows线程同步机制;(2) 了解互斥体,并通过查阅资料理解互斥体对象的使用方法;(3) 了解事件,并通过查阅资料理解事件对象的使用方法;(4) 了解关键区,并通过查阅资料理解关键区对象的使用方法;(5) 了解信号量,并通过查阅资料理解信号量对象的使用方法;(6) 利用Windows线程同步机制,模拟生产者消费者问题。
【实验要求】(1) 逐程序进行简要分析、运行各程序并仔细阅读注释;(2) 查阅MSDN或其他资料,掌握相关系统调用使用方法和参数含义;(3) 完成实验报告。
【实验步骤】(1) 阅读和理解2-1(mutex).cpp文件中的程序,运行2-1(mutex).cpp,认真观察结果。
然后将两个子函数中注释掉的Sleep语句让其可用,再多次运行,认真观察结果,不会出现销售异常情况。
比较修改程序前后运行结果发生的变化,并分析其原因。
(2) 2-2(event).cpp、2-3(critical_section).cpp的处理方式同(1)。
(3) 阅读和理解2-4(Producer_Consumer).cpp文件中的程序,运行2-4(Producer_Consumer).cpp,认真观察结果,先生产后消费。
然后将两个子函数中注释掉的while语句让其可用,再多次运行,认真观察结果,生产者和消费者保持同步。
比较修改程序前后运行结果发生的变化,并分析其原因。
(4) 阅读和理解2-4(Producer_Consumer)1.cpp文件中的程序,运行2-4(Producer_Consumer)1.cpp,认真观察结果。
操作系统windows 2000实验报告
《操作系统》实验报告专业:年级:学号:提交日期:_______________________实验一:操作系统环境1.1 Windows 2000 系统管理(实验估计时间:60分钟)实验内容与步骤1、计算机管理2、事件查看器3、性能监视4、服务5、数据库(ODBC)为了帮助用户管理和监视系统,Windows 2000提供了多种系统管理工具,其中最主要的有计算机管理、事件查看器和性能监视等。
步骤1:登录进入Windows 2000 Professional。
步骤2:在“开始”菜单中单击“设置”-“控制面板”命令,双击“管理工具”图标。
在本地计算机“管理工具”组中,有哪些系统管理工具,基本功能是什么:1.本地安全策略:查看和修改本地安全策略,诸如用户权限和审计策略。
2.服务:启动和停止由Windows系统提供的各项服务。
3.计算机管理:管理磁盘以及使用其他系统工具来管理本地或远程计算机。
4.事件查看器:显示来自于Window和其他程序的监视与排错信息。
例如,在“系统日志”中包含各种系统组件记录的事件,如使用驱动器失败或加载其他系统组件;“安全日志”中包含有效与无效的登录尝试及与资源使用有关的事件,如删除文件或修改设置等,本地计算机上的安全日志只有本机用户才能查看;“应用程序日志”中包括由应用程序记录的事件等等。
5.数据源(ODBC):即开放数据库连接。
添加、删除以及配置ODBC数据源和驱动程序,通过ODBC可以访问来自多种数据库管理系统的数据。
6.性能:显示系统性能图表以及配置数据日志和警报。
7.组建服务:配置并管理COM+ 应用程序。
1. 计算机管理使用“计算机管理”可通过一个合并的桌面工具来管理本地或远程计算机,它将几个Windows 2000管理实用程序合并到一个控制台目录树中,使管理员可以轻松地访问特定计算机的管理属性和工具。
步骤3:在“管理工具”窗口中,双击“计算机管理”图标。
“计算机管理”使用的窗口与“Windows资源管理器”相似。
操作系统实验指导书
目录实验一Windows 2000进程观测 (1)实验二Windows 2000进程控制 (3)实验三Windows 2000线程同步 (6)实验四Windows 2000线程间通信 (10)实验五Windows 2000内存结构 (14)《操作系统实验指导书》实验一Windows 2000进程观测一、实验目的:通过对Windows 2000编程,进一步熟悉操作系统的基本概念,较好地理解Windows 2000的结构。
二、实验环境:PC机、Windows 2000、V isual C++ 6.0专业版或企业版三、实验描述:对Windows 2000进程,利用任务程序观测四、实验要求:1.认真阅读和掌握本实验的算法。
2.上机将本算法实现。
3.保存和打印出程序的运行结果,并结合程序进行分析。
五、实验步骤:1. 简单的控制台应用程序我们先来创建一个名为“Hello,World”的应用程序。
步骤1:登录进入Windows 2000 Professional。
步骤2:在“开始”菜单中单击“程序”-“附件”-“记事本”命令,将清单1-l中的程序键入记事本中,并把代码保存为Hello.cpp。
清单1-1 一个简单的Windows 2000控制台应用程序// hello项目# include <iostream>void main(){std::cout << “Hello, Windows 2000” << std :: endl ;}步骤3:在“开始”菜单中单击“程序”-“附件”-“命令提示符”命令,进入Windows“命令提示符”窗口,并利用简单的标准命令行:C:\> CL Hello.cpp来创建可执行的Hello.EXE。
步骤4:运行Hello.EXE程序,产生用户键入的一行文字。
2. GUI应用程序在下面的实验中,C++ 编译器创建一个GUI应用程序,代码中包括了WinMain() 方法,这是GUI类型的应用程序的标准入口点。
实验二 编程实现进程(线程)同步和互斥
《操作系统》实验内容实验二编程实现进程(线程)同步和互斥1.实验的目的(1)通过编写程序实现进程同步和互斥,使学生掌握有关进程(线程)同步与互斥的原理,以及解决进程(线程)同步和互斥的算法,从而进一步巩固进程(线程)同步和互斥等有关的内容。
(2)了解Windows2000/XP中多线程的并发执行机制,线程间的同步和互斥。
(3)学习使用Windows2000/XP中基本的同步对象,掌握相应的API函数。
(4)掌握进程和线程的概念,进程(线程)的控制原语或系统调用的使用。
(5)掌握多道程序设计的基本理论、方法和技术,培养学生多道程序设计的能力。
2.实验内容在Windows XP、Windows 2000等操作系统下,使用的VC、VB、java或C等编程语言,采用进程(线程)同步和互斥的技术编写程序实现生产者-消费者问题或哲学家进餐问题或读者-写者问题或自己设计一个简单进程(线程)同步和互斥的实际问题。
3.实验要求(1)经调试后程序能够正常运行。
(2)采用多进程或多线程方式运行,体现了进程(线程)同步和互斥的关系。
(3)程序界面美观。
4.实验步骤(1)需求分析:了解基本原理,确定程序的基本功能,查找相关资料,画出基本的数据流图;(2)概要设计:确定程序的总体结构、模块关系和总体流程;(3)详细设计:确定模块内部的流程和实现算法;(4)上机编码和调试;(5)运行测试;(6)编写实验报告。
5.实验报告要求格式符合《实验报告格式》书;书写规范,排版美观,有较强的文字表达能力,能够正确地表达自己的思想,图表符合规范。
6.实验说明本实验分两次进行,每次要求填写一份实验报告,报告中的实验名分别为:编程实现进程同步和互斥1和编程实现进程同步和互斥2,其他内容依据实验进度具体填写。
实验二 进程(线程)的同步与互斥
实验二 进程(线程)的同步与互斥一、实验目的1. 掌握基本的同步与互斥算法,理解生产者消费者模型。
2. 学习使用Windows 中基本的同步对象,掌握相关API 的使用方法。
3. 了解Windows 中多线程的并发执行机制,实现进程的同步与互斥。
二、实验内容1. 实验内容以生产者/消费者模型为依据,在Windows 环境下创建一个控制台进程,在该进程中创建n 个线程模拟生产者和消费者,实现进程(线程)的同步与互斥。
2. 实验要求● 学习并理解生产者/消费者模型及其同步/互斥规则; ● 学习了解Windows 同步对象及其特性; ● 熟悉实验环境,掌握相关API 的使用方法;● 设计程序,实现生产者/消费者进程(线程)的同步与互斥;三、相关API 的功能及使用我们利用Windows SDK 提供的API 编程实现实验题目要求,而VC 中包含有Windows SDK 的所有工具和定义。
要使用这些API ,需要包含堆这些函数进行说明的SDK 头文件——最常见的是Windows.h(特殊的API 调用还需要包含其他头文件)。
下面给出的是本实验使用到的API 的功能和使用方法简单介绍。
(1) CreateThread● 功能——创建一个在调用进程的地址空间中执行的线程 ● 格式HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes,DWORD dwStackSize,LPTHREAD_START_ROUTINE lpStartAddress,LPVOID lpParamiter,Buffer(共享内存)生产者消费者DWORD dwCreationFlags,Lpdword lpThread );●参数说明lpThreadAttributes——指向一个LPSECURITY_ATTRIBUTES(新线程的安全性描述符)。
dwStackSize——定义原始堆栈大小。
实验三 Windows 2000线程同步
OpenEvent()
SetEvent()
ResetEvent()
将手工重置事件转化为非接受信号状态
PulseEvent()
将自动重置事件对象转化为已接受信号状 态。当系统释放所有的等待它的线程时此 种转化立即发生
为了获得互斥体,首先,想要访问调用的线程 可使用OpenMutex() API来获得指向对象的句 柄;然后,线程将这个句柄提供给一个等待函 数。当内核将互斥体对象发送给等待线程时, 就表明该线程获得了互斥体的拥有权。当线程 获得拥有权时,线程控制了对共享资源的访 问——必须设法尽快地放弃互斥体。放弃共享 资源时需要在该对象上调用ReleaseMute() API。然后系统负责将互斥体拥有权传递给下 一个等待着的线程 (由到达时间决定顺序) 。
// 创建子进程 if (:: CreateChild()) { std :: cout << " chlid created" << std :: endl; // 等待,直到子进程发出信号 std :: cout << "Parent waiting on child." << std :: endl; :: WaitForSingleObject(hEventContinue, INFINITE); :: Sleep(1500); } // 删去这句试试 std :: cout << "parent received the envent signaling from child" << std :: endl;
}
// 解除程序释放对对象的引用 virtual ~CCountUpDown() { :: CloseHandle(m_hThreadInc) ; :: CloseHandle(m_hThreadDec) ; :: CloseHandle(m_hMutexValue) ; }
实验2 熟悉Windows2000
实验二熟悉Windows2000/XP中的进程和线程一、实验目的1、熟悉Windows2000/XP中任务管理器的使用。
2、通过任务管理器识别操作系统中的进程和线程的相关信息。
3、掌握利用spy++.exe来察看Windows中各个任务的更详细信息。
二、实验理论基础及教材对应关系1、实验理论基础:(1)操作系统中的进程和线程的概念;(2)进程PCB的各项指标含意;2、本实验内容主要对应于教材第2章。
三、实验内容与步骤1、启动操作系统自带的任务管理器:方法:直接按组合键Ctrl+Alt+Del,或者是在点击任务条上的“开始”“运行”,并输入“taskmgr.exe”。
如下图所示:2、调整任务管理器的“查看”中的相关设置,显示关于进程的以下各项信息,并完成下表(填满即可):表一:统计进程的各项主要信息3、从桌面启动办公软件“Word ”,在任务管理器中找到该软件的登记,并将其结束掉。
再从任务管理器中分别找到下列程序:winlogon.exe 、lsass.exe 、csrss.exe 、smss.exe ,试着结束它们,观察到的反应是 , 原因是。
4、在任务管理器中找到进程“explorer.exe ”,将之结束掉,并将桌面上你打开的所有窗口最小化,看看你的计算机系统起来什么样的变化 、得到的结论是 (说出explorer.exe 进程的作用)。
5、运行“spy++.exe ”应用软件,点击按钮“”,切换到进程显示栏上,查看进程“explorer.exe ”的各项信息,并填写下表:表二:统计线程的各项信息进程:explorer.exe 中的各个线程6、注意某些线程前有“+”,如图所示:,说明二者之间的差异是他们的ip 地址相同,前面有+的说明下面其有子窗口。
操作系统windows 2000实验报告
《操作系统》实验报告专业:年级:学号:提交日期:_______________________实验一:操作系统环境1.1 Windows 2000 系统管理(实验估计时间:60分钟)实验内容与步骤1、计算机管理2、事件查看器3、性能监视4、服务5、数据库(ODBC)为了帮助用户管理和监视系统,Windows 2000提供了多种系统管理工具,其中最主要的有计算机管理、事件查看器和性能监视等。
步骤1:登录进入Windows 2000 Professional。
步骤2:在“开始”菜单中单击“设置”-“控制面板”命令,双击“管理工具”图标。
在本地计算机“管理工具”组中,有哪些系统管理工具,基本功能是什么:1.本地安全策略:查看和修改本地安全策略,诸如用户权限和审计策略。
2.服务:启动和停止由Windows系统提供的各项服务。
3.计算机管理:管理磁盘以及使用其他系统工具来管理本地或远程计算机。
4.事件查看器:显示来自于Window和其他程序的监视与排错信息。
例如,在“系统日志”中包含各种系统组件记录的事件,如使用驱动器失败或加载其他系统组件;“安全日志”中包含有效与无效的登录尝试及与资源使用有关的事件,如删除文件或修改设置等,本地计算机上的安全日志只有本机用户才能查看;“应用程序日志”中包括由应用程序记录的事件等等。
5.数据源(ODBC):即开放数据库连接。
添加、删除以及配置ODBC数据源和驱动程序,通过ODBC可以访问来自多种数据库管理系统的数据。
6.性能:显示系统性能图表以及配置数据日志和警报。
7.组建服务:配置并管理COM+ 应用程序。
1. 计算机管理使用“计算机管理”可通过一个合并的桌面工具来管理本地或远程计算机,它将几个Windows 2000管理实用程序合并到一个控制台目录树中,使管理员可以轻松地访问特定计算机的管理属性和工具。
步骤3:在“管理工具”窗口中,双击“计算机管理”图标。
“计算机管理”使用的窗口与“Windows资源管理器”相似。
网络编程技术实验2——Windows线程同步和互斥
实验2 Windows线程同步和互斥实验目的1、了解Windows内核对线程同步的支持。
2、了解C的线程函数库及Windows 基本的线程API 函数的使用。
3、进一步理解线程的同步控制原理。
预备知识一、Windows线程同步机制(注:互斥是同步的一种特例)⏹事件(Event)⏹临界区(Critical Section)⏹互斥量(Mutex)⏹信号量(Semaphore)1、是否能跨进程使用?互斥量、信号量、事件都可以跨进程来实现同步数据操作。
临界区只能用在同一进程的线程间互斥,因为临界区无名(无句柄)。
如果只为了在进程内部用的话,使用临界区会带来速度上的优势并能够减少资源占用量。
2、其它区别临界区:访问临界资源的代码段。
课堂上讲过。
(存钱、取钱的例子还记得吗?)互斥量:资源独占使用信号量:资源计数器事件对象:可以通过“通知”的方式来保持线程的同步。
事件是WIN32中最灵活的线程间同步机制。
事件存在两种状态:激发状态(Signaled or True)未激发状态(Unsignaled or False)。
3、详细解释:(见下面实验内容每个程序前)二、VC++(略)实验内容1、用事件(Event)对象来进行线程同步⏹事件可分为两类:⏹手动设置:这种对象只可能用程序手动设置,在需要该事件或者事件发生时,采用SetEvent及ResetEvent来进行设置。
⏹自动恢复:一旦事件发生并被处理后,自动恢复到没有事件状态,不需要再次设置。
⏹_beginthread函数:创建一个线程。
所在库文件:#include <process.h>uintptr_t _beginthread(void( *start_address )( void * ),unsigned stack_size,void *arglist);返回值:假如成功,函数将返回一个处理信息对这个新创建的线程。
如果失败_beginthread将返回-1。
操作系统实验报告—Windows线程同步机制
2012-2013学年第一学期计算机操作系统实验报告专业:班级:学号:姓名:提交日期:Windows线程同步机制【开发语言及实现平台或实验环境】C++/C#Microsoft Visual Studio 6.0/ Microsoft Visual Studio .NET【实验目的】(1) 了解Windows线程同步机制;(2) 了解互斥体,并通过查阅资料理解互斥体对象的使用方法;(3) 了解事件,并通过查阅资料理解事件对象的使用方法;(4) 了解关键区,并通过查阅资料理解关键区对象的使用方法;(5) 了解信号量,并通过查阅资料理解信号量对象的使用方法;(6) 利用Windows线程同步机制,模拟生产者消费者问题。
【实验要求】(1) 逐程序进行简要分析、运行各程序并仔细阅读注释;(2) 查阅MSDN或其他资料,掌握相关系统调用使用方法和参数含义;(3) 完成实验报告。
【实验步骤】(1) 阅读和理解2-1(mutex).cpp文件中的程序,运行2-1(mutex).cpp,认真观察结果。
然后将两个子函数中注释掉的Sleep语句让其可用,再多次运行,认真观察结果,不会出现销售异常情况。
比较修改程序前后运行结果发生的变化,并分析其原因。
(2) 2-2(event).cpp、2-3(critical_section).cpp的处理方式同(1)。
(3) 阅读和理解2-4(Producer_Consumer).cpp文件中的程序,运行2-4(Producer_Consumer).cpp,认真观察结果,先生产后消费。
然后将两个子函数中注释掉的while语句让其可用,再多次运行,认真观察结果,生产者和消费者保持同步。
比较修改程序前后运行结果发生的变化,并分析其原因。
(4) 阅读和理解2-4(Producer_Consumer)1.cpp文件中的程序,运行2-4(Producer_Consumer)1.cpp,认真观察结果。
线程的同步和互斥问题
实验二线程的同步和互斥问题一.实验内容:编写程序实现并发线程之间的同步和互斥问题。
线程间的互斥:并发执行的线程共享某些类临界资源,对临界资源的访问应当采取互斥的机制。
线程间的同步:并发执行的线程间通常存在相互制约的关系,线程必须遵循一定的规则来执行,同步机制可以协调相互制约的关系。
二.实验目的和要求1)了解进程同步与互斥的概念,掌握编写进程同步、互斥的实例。
2)解决一类典型的进程间同步问题,如生产者-消费者问题,读者-写者问题等。
三.实验方法和步骤1.实验方法掌握同步与互斥的机制,选取合适的问题,给出演示程序的设计思想,包括流程图的形式;选取C、C++、VC、JA V A等计算机语言,编程调试,最终给出运行正确的程序。
2.程序设计(1)线程间互斥:分析问题,创建多个线程,找出临界资源,划出正确的临界区,根据互斥机制的操作模式,编写程序。
互斥机制的操作模式:p(mutex);/*关锁*/临界区的操作;v(mutex);/*开锁*/(2)线程间同步——读者-写者问题示例:在Windows 2000 环境下,创建一个包含n 个线程的控制台进程。
用这n 个线程来表示n个读者或写者。
每个线程按相应测试数据文件的要求,进行读写操作。
请用信号量机制分别实现读者优先和写者优先的读者-写者问题。
读者-写者问题的读写操作限制:1)写-写互斥;2)读-写互斥;3)读-读允许;运行结果显示要求:要求在每个线程创建、发出读写操作申请、开始读写操作和结束读写操作时分别显示一行提示信息,以确信所有处理都遵守相应的读写操作限制。
测试数据文件格式测试数据文件包括n 行测试数据,分别描述创建的n 个线程是读者还是写者,以及读写操作的开始时间和持续时间。
每行测试数据包括四个字段,各字段间用空格分隔。
第一字段为一个正整数,表示线程序号。
第二字段表示相应线程角色,R 表示读者是,W 表示写者。
第三字段为一个正数,表示读写操作的开始时间。
网络编程技术实验2——Windows线程同步和互斥解析
实验2 Windows线程同步和互斥实验目的1、了解Windows内核对线程同步的支持。
2、了解C的线程函数库及Windows 基本的线程API 函数的使用。
3、进一步理解线程的同步控制原理。
预备知识一、Windows线程同步机制(注:互斥是同步的一种特例)⏹事件(Event)⏹临界区(Critical Section)⏹互斥量(Mutex)⏹信号量(Semaphore)1、是否能跨进程使用?互斥量、信号量、事件都可以跨进程来实现同步数据操作。
临界区只能用在同一进程的线程间互斥,因为临界区无名(无句柄)。
如果只为了在进程内部用的话,使用临界区会带来速度上的优势并能够减少资源占用量。
2、其它区别临界区:访问临界资源的代码段。
课堂上讲过。
(存钱、取钱的例子还记得吗?)互斥量:资源独占使用信号量:资源计数器事件对象:可以通过“通知”的方式来保持线程的同步。
事件是WIN32中最灵活的线程间同步机制。
事件存在两种状态:激发状态(Signaled or True)未激发状态(Unsignaled or False)。
3、详细解释:(见下面实验内容每个程序前)二、VC++(略)实验内容1、用事件(Event)对象来进行线程同步⏹事件可分为两类:⏹手动设置:这种对象只可能用程序手动设置,在需要该事件或者事件发生时,采用SetEvent及ResetEvent来进行设置。
⏹自动恢复:一旦事件发生并被处理后,自动恢复到没有事件状态,不需要再次设置。
⏹_beginthread函数:创建一个线程。
所在库文件:#include <process.h>uintptr_t _beginthread(void( *start_address )( void * ),unsigned stack_size,void *arglist);返回值:假如成功,函数将返回一个处理信息对这个新创建的线程。
如果失败_beginthread将返回-1。
操作系统 线程的同步
上海电力学院计算机操作系统原理实验报告题目:实验二:线程的同步院系:计算机科学与技术学院专业年级:2013级学生姓名:吴xx 学号:2013xxxx同组姓名:2015年10 月19 日上海电力学院实验报告课程名称计算机操作系统实验项目实验二:线程的同步姓名吴xx 学号2013xxxx 班级2013xxx 专业信息安全同组人姓名无指导教师姓名实验日期实验目的和要求:1、进一步掌握Windows系统环境下线程创建与撤销。
2、熟悉Windows系统提供的线程同步API。
3、使用Windows系统提供的线程同步API解决实际问题。
实验内容:完成主、子两个线程之间的同步,要求子线程先运行。
在线程中使用系统调用CreateThread()创建一个子线程。
主线程创建子线程后进入阻塞状态,直到子线程运行完毕后唤醒主线程。
操作系统:Windows10实验平台:Visual Studio 2013实验步骤与记录:一、创建线程句柄、信号量句柄二、创建一个信号量CreateSemaphore()三、打开信号量OpenSemaphore()四、创建子线程CreateThread()五、主线程等待子线程waitForSingleObject()实验分析与结论:这次实验我比上次更加细心了,打错的字比上次少了很多.本次试验有多个线程,线程与线程之间相互关联,进行数据的交换。
子线程的实体是调用的一个函数func()。
程序中的判断语句较多,凸显了流程控制中条件判断的重要性。
我们在写程序的时候也应该注意到,不能漏到一些可能出现的异常情况。
程序截图:。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验2并发与调度2.2 Windows 2000线程同步(实验估计时间:120分钟)➢背景知识➢实验目的➢工具/准备工作➢实验内容与步骤背景知识Windows 2000提供的常用对象可分成三类:核心应用服务、线程同步和线程间通讯。
其中,开发人员可以使用线程同步对象来协调线程和进程的工作,以使其共享信息并执行任务。
此类对象包括互锁数据、临界段、事件、互斥体和信号等。
多线程编程中关键的一步是保护所有的共享资源,工具主要有互锁函数、临界段和互斥体等;另一个实质性部分是协调线程使其完成应用程序的任务,为此,可利用内核中的事件对象和信号。
在进程内或进程间实现线程同步的最方便的方法是使用事件对象,这一组内核对象允许一个线程对其受信状态进行直接控制(见表4-1) 。
而互斥体则是另一个可命名且安全的内核对象,其主要目的是引导对共享资源的访问。
拥有单一访问资源的线程创建互斥体,所有想要访问该资源的线程应该在实际执行操作之前获得互斥体,而在访问结束时立即释放互斥体,以允许下一个等待线程获得互斥体,然后接着进行下去。
与事件对象类似,互斥体容易创建、打开、使用并清除。
利用CreateMutex() API可创建互斥体,创建时还可以指定一个初始的拥有权标志,通过使用这个标志,只有当线程完成了资源的所有的初始化工作时,才允许创建线程释放互斥体。
API名称描述CreateEvent() 在内核中创建一个新的事件对象。
此函数允许有安全性设置、手工还是自动重置的标志以及初始时已接受还是未接受信号状态的标志OpenEvent() 创建对已经存在的事件对象的引用。
此API函数需要名称、继承标志和所需的访问级别SetEvent() 将手工重置事件转化为已接受信号状态ResetEvent() 将手工重置事件转化为非接受信号状态PulseEvent() 将自动重置事件对象转化为已接受信号状态。
当系统释放所有的等待它的线程时此种转化立即发生为了获得互斥体,首先,想要访问调用的线程可使用OpenMutex() API来获得指向对象的句柄;然后,线程将这个句柄提供给一个等待函数。
当内核将互斥体对象发送给等待线程时,就表明该线程获得了互斥体的拥有权。
当线程获得拥有权时,线程控制了对共享资源的访问——必须设法尽快地放弃互斥体。
放弃共享资源时需要在该对象上调用ReleaseMute() API。
然后系统负责将互斥体拥有权传递给下一个等待着的线程(由到达时间决定顺序) 。
实验目的在本实验中,通过对事件和互斥体对象的了解,来加深对Windows 2000线程同步的理解。
1) 回顾系统进程、线程的有关概念,加深对Windows 2000线程的理解。
2) 了解事件和互斥体对象。
3) 通过分析实验程序,了解管理事件对象的API。
4) 了解在进程中如何使用事件对象。
5) 了解在进程中如何使用互斥体对象。
6) 了解父进程创建子进程的程序设计方法。
工具/准备工作在开始本实验之前,请回顾教科书的相关内容。
您需要做以下准备:1) 一台运行Windows 2000 Professional操作系统的计算机。
2) 计算机中需安装Visual C++ 6.0专业版或企业版。
实验内容与步骤1. 事件对象2. 互斥体对象1. 事件对象清单2-1程序展示了如何在进程间使用事件。
父进程启动时,利用CreateEvent() API创建一个命名的、可共享的事件和子进程,然后等待子进程向事件发出信号并终止父进程。
在创建时,子进程通过OpenEvent() API打开事件对象,调用SetEvent() API使其转化为已接受信号状态。
两个进程在发出信号之后几乎立即终止。
步骤1:登录进入Windows 2000 Professional。
步骤2:在“开始”菜单中单击“程序”-“Microsoft Visual Studio 6.0”–“Microsoft Visual C++ 6.0”命令,进入Visual C++窗口。
步骤3:在工具栏单击“打开”按钮,在“打开”对话框中找到并打开实验源程序2-1.cpp。
清单2-1 创建和打开事件对象在进程间传送信号// event项目# include <windows.h># include <iostream>// 以下是句柄事件。
实际中很可能使用共享的包含文件来进行通讯static LPCTSTR g_szContinueEvent = "w2kdg.EventDemo.event.Continue";// 本方法只是创建了一个进程的副本,以子进程模式(由命令行指定) 工作BOOL CreateChild(){// 提取当前可执行文件的文件名TCHAR szFilename[MAX_PA TH] ;:: GetModuleFileName(NULL, szFilename, MAX_PA TH) ;// 格式化用于子进程的命令行,指明它是一个EXE文件和子进程TCHAR szCmdLine[MAX_PA TH] ;:: sprintf(szCmdLine, "\"%s\"child" , szFilename) ;// 子进程的启动信息结构STARTUPINFO si;:: ZeroMemory(reinterpret_cast<void*>(&si), sizeof(si)) ;si.cb = sizeof(si); // 必须是本结构的大小// 返回的子进程的进程信息结构PROCESS_INFORMA TION pi;// 使用同一可执行文件和告诉它是一个子进程的命令行创建进程BOOL bCreateOK = :: CreateProcess(szFilename, // 生成的可执行文件名szCmdLine, // 指示其行为与子进程一样的标志NULL, // 子进程句柄的安全性NULL, // 子线程句柄的安全性FALSE, // 不继承句柄0, // 特殊的创建标志NULL, // 新环境NULL, // 当前目录&si, // 启动信息结构&pi ) ; // 返回的进程信息结构// 释放对子进程的引用if (bCreateOK){:: CloseHandle(pi.hProcess);:: CloseHandle(pi.hThread);}return(bCreateOK) ;}// 下面的方法创建一个事件和一个子进程,然后等待子进程在返回前向事件发出信号void WaitForChild(){// create a new event object for the child process// to use when releasing this processHANDLE hEventContinue = :: CreateEvent(NULL, // 缺省的安全性,子进程将具有访问权限TRUE, // 手工重置事件FALSE, // 初始时是非接受信号状态g_szContinueEvent); // 事件名称if (hEventContinue!=NULL){std :: cout << "event created " << std :: endl;// 创建子进程if (:: CreateChild()){std :: cout << " chlid created" << std :: endl;// 等待,直到子进程发出信号std :: cout << "Parent waiting on child." << std :: endl;:: WaitForSingleObject(hEventContinue, INFINITE);:: Sleep(1500); // 删去这句试试std :: cout << "parent received the envent signaling from child" << std :: endl;}// 清除句柄:: CloseHandle(hEventContinue);hEventContinue = INV ALID_HANDLE_V ALUE;}}// 以下方法在子进程模式下被调用,其功能只是向父进程发出终止信号void SignalParent(){// 尝试打开句柄std :: cout << "child process begining......" << std :: endl;HANDLE hEventContinue = :: OpenEvent(EVENT_MODIFY_STATE, // 所要求的最小访问权限FALSE, // 不是可继承的句柄g_szContinueEvent); // 事件名称if (hEventContinue != NULL){:: SetEvent(hEventContinue);std :: cout << "event signaled" << std :: endl;}// 清除句柄:: CloseHandle(hEventContinue) ;hEventContinue = INV ALID_HANDLE_V ALUE;}int main(int argc, char* argv[] ){// 检查父进程或是子进程是否启动if (argc>1 && :: strcmp(argv[1] , "child" )== 0){// 向父进程创建的事件发出信号:: SignalParent() ;}else{// 创建一个事件并等待子进程发出信号:: WaitForChild() ;:: Sleep(1500) ;std :: cout << "Parent released." << std :: endl ;}return 0;}步骤4:单击“Build”菜单中的“Compile 2-1.cpp”命令,并单击“是”按钮确认。
系统对2-1.cpp进行编译。
步骤5:编译完成后,单击“Build”菜单中的“Build 2-1.exe”命令,建立2-1.exe可执行文件。
操作能否正常进行?如果不行,则可能的原因是什么?操作能正常进行步骤6:在工具栏单击“Execute Program”(执行程序) 按钮,执行2-1.exe程序。