操作系统实验二
操作系统实验二

实验二并发与调度一、实验目的在本实验中,通过对事件和互斥体对象的了解,来加深对Windows 2000线程同步的理解。
通过分析实验程序,了解管理事件对象的API。
了解在进程中如何使用事件对象,在进程中如何使用互斥体对象,线程如何通过文件映射对象发送数据。
在Linux Redhat 9.0操作系统平台上,用pipe()创建一个管道文件,然后用fork()创建两个生产进程和两个消费进程,它们之间通过pipe()传递消息。
二、实验环境硬件环境:计算机一台,局域网环境;软件环境:Windows 2000 Professional,Linux Redhat 9.0操作系统平台,Visual C++ 6.0企业版。
三、实验内容和步骤第一部分:互斥体对象本程序中显示的类CCountUpDown使用了一个互斥体来保证对两个线程间单一数值的访问。
每个线程都企图获得控制权来改变该数值,然后将该数值写入输出流中。
创建者实际上创建的是互斥体对象,计数方法执行等待并释放,为的是共同使用互斥体所需的资源(因而也就是共享资源) 。
利用互斥体保护共享资源// mutex项目# include <windows.h># include <iostream>class CCountUpDown{public:CCountUpDown(int nAccesses) :m_hThreadInc(INV ALID_HANDLE_V ALUE) ,m_hThreadDec(INV ALID_HANDLE_V ALUE) ,m_hMutexV alue(IN V ALID_HANDLE_V ALUE) ,m_nV alue(0) ,m_nAccess(nAccesses){m_hMutexV alue = :: CreateMutex(NULL,TRUE,NULL) ;m_hThreadInc = :: CreateThread(NULL,0,IncThreadProc,reinterpret_cast <LPVOID> (this) ,0,NULL) ;m_hThreadDec = :: CreateThread(NULL,0,DecThreadProc,reinterpret_cast <LPVOID> (this) ,0,NULL) ;:: ReleaseMutex(m_hMutexV alue) ;}virtual ~CCountUpDown(){:: CloseHandle(m_hThreadInc) ;:: CloseHandle(m_hThreadDec) ;:: CloseHandle(m_hMutexV alue) ;}virtual void WaitForCompletion(){if (m_hThreadInc != INV ALID_HANDLE_V ALUE &&m_hThreadDec != INV ALID_HANDLE_V ALUE){:: WaitForSingleObject(m_hThreadInc, INFINITE) ;:: WaitForSingleObject(m_hThreadDec, INFINITE) ;}}protected:virtual void DoCount(int nStep){while (m_nAccess > 0){:: WaitForSingleObject(m_hMutexV alue, INFINITE) ;m_nV alue += nStep;std :: cout << “thread: ” << :: GetCurrentThreadId()<< “value: ” << m_n V alue<< “access: ” << m_nAccess << std :: endl;--m_nAccess;:: Sleep(1000) ; // 使显示速度放慢:: ReleaseMutex(m_hMutexV alue) ;}}static DWORD WINAPI IncThreadProc(LPVOID lpParam){CCountUpDown* pThis =reinterpret_cast < CCountUpDown* > (lpParam) ;pThis -> DoCount(+1) ;return(0) ;}static DWORD WINAPI DecThreadProc(LPVOID lpParam){CCountUpDown* pThis =reinterpret_cast <CCountUpDown* > (lpParam) ;pThis -> DoCount(-1) ;return(0) ;}protected:HANDLE m_hThreadInc;HANDLE m_hThreadDec;HANDLE m_hMutexV alue;int m_nV alue;int m_nAccess ;} ;void main(){ CCountUpDown ud(50) ;ud.WaitForCompletion() ; }分析程序的运行结果,可以看到线程(加和减线程) 的交替执行(因为Sleep() API允许Windows切换线程) 。
操作系统实验二实验报告

操作系统实验二实验报告一、实验目的本次操作系统实验二的主要目的是深入理解和掌握进程管理的相关概念和技术,包括进程的创建、执行、同步和通信。
通过实际编程和实验操作,提高对操作系统原理的认识,培养解决实际问题的能力。
二、实验环境本次实验使用的操作系统为 Windows 10,编程环境为 Visual Studio 2019。
三、实验内容及步骤(一)进程创建实验1、首先,创建一个新的 C++项目。
2、在项目中,使用 Windows API 函数`CreateProcess`来创建一个新的进程。
3、为新进程指定可执行文件的路径、命令行参数、进程属性等。
4、编写代码来等待新进程的结束,并获取其退出代码。
(二)进程同步实验1、设计一个生产者消费者问题的模型。
2、使用信号量来实现生产者和消费者进程之间的同步。
3、生产者进程不断生成数据并放入共享缓冲区,当缓冲区已满时等待。
4、消费者进程从共享缓冲区中取出数据进行处理,当缓冲区为空时等待。
(三)进程通信实验1、选择使用管道来实现进程之间的通信。
2、创建一个匿名管道,父进程和子进程分别读写管道的两端。
3、父进程向管道写入数据,子进程从管道读取数据并进行处理。
四、实验结果及分析(一)进程创建实验结果成功创建了新的进程,并能够获取到其退出代码。
通过观察进程的创建和执行过程,加深了对进程概念的理解。
(二)进程同步实验结果通过使用信号量,生产者和消费者进程能够正确地进行同步,避免了缓冲区的溢出和数据的丢失。
分析结果表明,信号量机制有效地解决了进程之间的资源竞争和协调问题。
(三)进程通信实验结果通过管道实现了父进程和子进程之间的数据通信。
数据能够准确地在进程之间传递,验证了管道通信的有效性。
五、遇到的问题及解决方法(一)在进程创建实验中,遇到了参数设置不正确导致进程创建失败的问题。
通过仔细查阅文档和调试,最终正确设置了参数,成功创建了进程。
(二)在进程同步实验中,出现了信号量使用不当导致死锁的情况。
操作系统实验二:进程管理

操作系统实验二:进程管理操作系统实验二:进程管理篇一:操作系统实验报告实验一进程管理一、目的进程调度是处理机管理的核心内容。
本实验要求编写和调试一个简单的进程调度程序。
通过本实验加深理解有关进程控制块、进程队列的概念,并体会和了解进程调度算法的具体实施办法。
二、实验内容及要求1、设计进程控制块PCB的结构(PCB结构通常包括以下信息:进程名(进程ID)、进程优先数、轮转时间片、进程所占用的CPU时间、进程的状态、当前队列指针等。
可根据实验的不同,PCB结构的内容可以作适当的增删)。
为了便于处理,程序中的某进程运行时间以时间片为单位计算。
各进程的轮转时间数以及进程需运行的时间片数的初始值均由用户给定。
2、系统资源(r1…rw),共有w类,每类数目为r1…rw。
随机产生n进程Pi(id,s(j,k)t),0<=i<=n,0<=j<=m,0<=k<=dt为总运行时间,在运行过程中,会随机申请新的资源。
3、每个进程可有三个状态(即就绪状态W、运行状态R、等待或阻塞状态B),并假设初始状态为就绪状态。
建立进程就绪队列。
4、编制进程调度算法:时间片轮转调度算法本程序用该算法对n个进程进行调度,进程每执行一次,CPU时间片数加1,进程还需要的时间片数减1。
在调度算法中,采用固定时间片(即:每执行一次进程,该进程的执行时间片数为已执行了1个单位),这时,CPU时间片数加1,进程还需要的时间片数减1,并排列到就绪队列的尾上。
三、实验环境操作系统环境:Windows系统。
编程语言:C#。
四、实验思路和设计1、程序流程图2、主要程序代码//PCB结构体struct pcb{public int id; //进程IDpublic int ra; //所需资源A的数量public int rb; //所需资源B的数量public int rc; //所需资源C的数量public int ntime; //所需的时间片个数public int rtime; //已经运行的时间片个数public char state; //进程状态,W(等待)、R(运行)、B(阻塞)//public int next;}ArrayList hready = new ArrayList();ArrayList hblock = new ArrayList();Random random = new Random();//ArrayList p = new ArrayList();int m, n, r, a,a1, b,b1, c,c1, h = 0, i = 1, time1Inteval;//m为要模拟的进程个数,n为初始化进程个数//r为可随机产生的进程数(r=m-n)//a,b,c分别为A,B,C三类资源的总量//i为进城计数,i=1…n//h为运行的时间片次数,time1Inteval为时间片大小(毫秒)//对进程进行初始化,建立就绪数组、阻塞数组。
实验二操作系统安全配置

实验二操作系统安全配置一.实验目的1.熟悉Windows NT/XP/2000系统的安全配置2. 懂得可信计算机评价准则二.实验内容1.Windows系统注册表的配置点击“开始\运行”选项,键入“regedit”命令打开注册表编辑器,学习并修改有关网络及安全的一些表项2.Windows系统的安全服务a.打开“操纵面板\管理工具\本地安全策略”,查阅并修改有效项目的设置。
b.打开“操纵面板\管理工具\事件查看器”,查阅并懂得系统日志,选几例,分析并说明不一致类型的事件含义。
3. IE浏览器安全设置打开Internet Explorer菜单栏上的“工具\Internet选项”,调整或者修改“安全”、“隐私”、“内容”等栏目的设置,分析、观察并验证你的修改。
4. Internet 信息服务安全设置打开“操纵面板\管理工具\Internet 信息服务”,修改有关网络及安全的一些设置,并启动WWW或者FTP服务器验证(最好与邻座同学配合)。
三.实验过程1. Windows系统注册表的配置点击“开始\运行”选项,键入“regedit”命令打开注册表编辑器,图如下:禁止修改显示属性HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\ Policies\System 在右边的窗口中创建一个DOWRD值:“NoDispCPL”,并将其值设为“1”。
没有成功,由于Policies里无System选项.在HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer 下在右边的窗口中新建一个二进制值“NoViewContextMenu”,并设值为“01 00 00 00”。
修改后需重新启动WINDOWS .2、Windows系统的安全服务打开“操纵面板\管理工具\本地安全策略”,查阅并修改有效项目的设置。
计算机操作系统实验二Windows任务管理器的进程管理

计算机操作系统实验二Windows任务管理器的进程管理实验二 Windows任务管理器的进程管理一实验目的1)在Windows 任务管理器中对程序进程进行响应的管理操作;2)熟悉操作系统进程管理的概念;3)学习观察操作系统运行的动态性能。
二实验环境需要准备一台运行Windows XP操作系统的计算机。
三背景知识Windows XP的任务管理器提供了用户计算机上正在运行的程序和进程的相关信息,也显示了最常用的度量进程性能的单位。
使用任务管理器,可以打开监视计算机性能的关键指示器,快速查看正在运行的程序的状态,或者终止已停止响应的程序。
也可以使用多个参数评估正在运行的进程的活动,以及查看CPU 和内存使用情况的图形和数据。
四实验内容与步骤启动并进入Windows环境,单击Ctrl + Alt + Del键,或者右键单击任务栏,在快捷菜单中单击“任务管理器”命令,打开“任务管理器”窗口。
当前机器中由你打开,正在运行的应用程序有:1) 实验二Windows 任务管理器的进程管理2) 常州大学—Windows Internet Explore3) 实验一Windows XP 系统管理4)可移动磁盘(H:)Windows“任务管理器”的窗口由_5_个选项卡组成,分别是:1) 应用程序2) 进程3) 性能4)联网当前“进程”选项卡显示的栏目分别是(可移动窗口下方的游标/箭头,或使窗口最大化进行观察) :1) 映像名称2) 用户名3) CPU4) 内存使用1. 使用任务管理器终止进程步骤1:单击“进程”选项卡,一共显示了__24_个进程。
请试着区分一下,其中:系统(SYSTEM) 进程有_14_个,填入表2-1中。
表2-1 实验记录映像名称用户名作用内存使用svchost.exe SYSTEM 用于执行dll文件 4988Kspoolsv.exe SYSTEM 管理所有本地和网络打 5544K印队列及控制所有打印工作lsass.exe SYSTEM 本地安全授权服务1460K services.exe SYSTEM 远程控制木马病毒3816Kwinlogon.exe SYSTEM 管理用户登录和退出5244Kcarss.exe SYSTEM 负责控制windows 12552K smss.exe SYSTEM 系统关键进程 500K CDAC11BA.exe SYSTEM 反复制保护软件1440K server.exe SYSTEM 用于Novell服务监听1196K MATLAB.exe SYSTEM 一种科学计算工程软件46576K MDM.exe SYSTEM 进行本地和远程调试 3532K service.exe SYSTEM 管理启动停止服务 3366K Inetinfo.exe SYSTEM 用于Debug调试除错 10236K system SYSTEM 系统进程 312K服务(SERVICE) 进程有_3_个,填入表2-2中。
操作系统实验2-计算机操作系统(第3版)-郁红英-清华大学出版社

操作系统实验
(课程设计)实验报告
学院
专业
班级/学号
学生姓名
成绩
实验地点_
实验日期___ __
指导教师_____ ___ _____
(课程上机)实验报告
1.实验名称、实验目的、实验内容、实验要求由教师确定,实验前由教师事先填好,然后作为实验报告模版供学生使用;
2.实验准备由学生在实验或上机之前填写,教师应该在实验前检查;
3.实验过程由学生记录实验的过程,包括操作过程、遇到哪些问题以及如何解决等;
4.实验总结由学生在实验后填写,总结本次实验的收获、未解决的问题以及体会和建议等;
5.源程序、代码、具体语句等,若表格空间不足时可作为附录另外附页。
操作系统实验二(进程管理)

操作系统进程管理实验实验题目:(1)进程的创建编写一段程序,使用系统调用fork( )创建两个子进程。
当此程序运行时,在系统中有一个父进程和两个子进程活动。
让每一个进程在屏幕上显示一个字符:父进程显示字符“a”;子进程分别显示字符“b”和字符“c”。
试观察记录屏幕上的显示结果,并分析原因。
(2)进程的控制修改已编写的程序,将每个进程输出一个字符改为每个进程输出一句话,在观察程序执行时屏幕上出现的现象,并分析原因。
(3)编制一段程序,使其实现进程的软中断通信。
要求:使用系统调用fork( )创建两个子进程,再用系统调用signal( )让父进程捕捉键盘上来的中断信号(即按Del键);当捕捉到中断信号后,父进程调用系统调用kill( )向两个子进程发出信号,子进程捕捉到信号后分别输出下列信息后终止: Child process 1 is killed by parent! Child process 2 is killed by parent! 父进程等待两个子进程终止后,输出如下的信息后终止: Parent process is killed! 在上面的程序中增加语句signal(SIGINT, SIG_IGN)和signal(SIGQUIT, SIG_IGN),观察执行结果,并分析原因。
(4)进程的管道通信编制一段程序,实现进程的管道通信。
使用系统调用pipe( )建立一条管道线;两个进程P1和P2分别向管道各写一句话: Child 1 is sending a message! Child 2 is sending a message! 而父进程则从管道中读出来自于两个子进程的信息,显示在屏幕上。
要求父进程先接收子进程P1发来的消息,然后再接收子进程P2发来的消息。
实验源程序及报告:(1)、进程的创建#include <stdio.h>int main(int argc, char *argv[]){int pid1,pid2; /*fork first child process*/if ( ( pid1=fork() ) < 0 ){printf( "ProcessCreate Failed!");exit(-1);}if ( ( pid1=fork() ) == 0 ){printf( "b\n" );}/*fork second child process*/if ( ( pid2=fork() ) < 0 ){printf( "ProcessCreate Failed!"); exit(-1);}if ( ( pid2=fork() ) == 0 ){printf( "c\n" );}/*parent process*/else{wait(NULL);printf( "a\n" );exit(0);}return 0;}(2)、进程的控制#include <stdio.h>int main(int argc, char *argv[]){ int pid1,pid2;/*fork first child process*/if ( ( pid1=fork() ) < 0 ){printf( "ProcessCreate Failed!");exit(-1);}if ( ( pid1=fork() ) == 0 ){printf( "This is my Unix OS program!\n" ); }/*fork second child process*/if ( ( pid2=fork() ) < 0 ){printf( "ProcessCreate Failed!");exit(-1);}if ( ( pid2=fork() ) == 0 ){printf( "This is the second Child process!\n" ); }/*parent process*/else{wait(NULL);printf( "This is the Parent process\n" );exit(0);}return 0;}(3)编制一段程序,使其实现进程的软中断通信。
操作系统实验报告(2)

计算机实验报告(2)操作系统部分一、基本要求和内容1.了解操作系统的基本功能.2.认识WINDOWS桌面的各部分组成,掌握基本的桌面操作.3.掌握各种基本操作对象的操作方法.4.学会使用WINDOWS帮助.5.了解基本的DOS命令和基本的命令行操作方法.6.熟练掌握文件操作方法.7.掌握对图标的操作方法(移动/拖曳/单击/双击/右击等等).8.熟悉资源管理器窗口和”我的电脑”(“计算机”)窗口.9.掌握启动控制面板的方法,了解控制面板的主要功能,掌握使用控制面板对软硬件进行设置的方法。
10.掌握“运行”对话框的使用方法。
11.了解“任务管理器”的简单使用方法。
12.熟悉“画图”“记事本”“计算器”“写字板”等常用应用程序。
13.开始POWERPOINT的基本使用.二、通过上机实验解决下列问题1. CTRL+ALT+DEL 组合键的功能是:打开【任务管理器】窗口2.全角和半角的区别是:半角是一个字符,全角是两个字符3. CTRL+A组合键的功能是:全部选中CTRL+C组合键的功能是:复制CTRL+V组合键的功能是:粘贴CTRL+X组合键的功能是:剪切CTRL+Z组合键的功能是: 撤销ALT+PRINTSCREEN组合键的功能是:复制当前窗口、对话框或其他对象到剪贴板中任务栏隐藏时通过什么组合键可以看到任务栏:Ctrl+Alt+Del进行窗口切换的组合键是:ALT+Tab4.“画图”应用程序默认保存文件类型是:*.png“记事本”应用程序默认保存文件类型是: *.txt.DOC是什么文件类型Word文档.EXE是什么文件类型可执行文件(程序文件)5.鼠标的基本操作方法包括:指向、单击、双击和拖动鼠标指针附近有漏沙钟表示当前的状态是: 沙漏是等待,因为程序先是从硬盘上读取,然后再到内存,芯片在其期间进行运算,再没真正的打开程序时,系统认为它没正真的启动6.资源管理器左下角窗格(即”文件夹”窗口)显示的是:系统中的所有资源以分层树型的结构显示出来7.一般情况下,对文件进行重命名时,不应该修改文件的扩展名,因为: 如果修改了后缀名则会导致文件属性更改,文件无法打开8.文件的属性主要包括哪些:“只读”、“存档”、“隐藏”9.选择多个连续的文件可以采用哪些方法:使用鼠标先选定第一个文件或文件夹,然后按住Shift键,用鼠标单击最后一个文件或文件夹,这样在第一个对象和最后一个对象之间的所有文件或文件夹将全部被选中,包括第一个和最后一个文件或文件夹。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
GDOU-B-11-112广东海洋大学学生实验报告书(学生用表)实验名称实验二课程名称操作系统课程号学院(系) 信息学院专业物联网工程班级1131学生姓名杨光学号201311672119 实验地点实验日期实验1:线程的创建与撤销1.实验目的(1)熟悉Windows系统提供的线程创建与撤销系统调用。
(2)掌握Windows系统环境下线程的创建与撤销方法。
2.实验要求能正确使用CreateThread()、ExitThread()及Sleep()等系统调用,进一步理解进程与线程理论。
代码一:// ThreadCreate.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include "ThreadCreate.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif/////////////////////////////////////////////////////////////////////////////// The one and only application objectCWinApp theApp;using namespace std;void ThreadName1();static HANDLE hHandle1=NULL; //用于存储线程返回句柄的变量。
DWORD dwThreadID1; //用于存储线程标识符的变量。
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]){int nRetCode = 0;hHandle1 = CreateThread( (LPSECURITY_ATTRIBUTES) NULL,0,(LPTHREAD_START_ROUTINE) ThreadName1,(LPVOID) NULL,0, &dwThreadID1 );Sleep(5000);CloseHandle(hHandle1);ExitThread(0);return nRetCode;}void ThreadName1(){printf("Thread is Runing!\n");}3.过程截图:实验2:线程的同步1.实验目的(1)进一步掌握Windows系统环境下线程的创建与撤销。
(2)熟悉Windows系统提供的线程同步API。
(3)使用Windows系统提供的线程同步API解决实际问题。
2.实验要求能正确使用等待对象WaitForSingleObject()或WaitForMultipleObeject()及信号量对象CreateSemaphore()、OpenSemaphore()、RealeaseSemaphore()等系统调用,进一步理解线程的同步代码二:// Semaphore.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include "Semaphore.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif/////////////////////////////////////////////////////////////////////////////// The one and only application objectCWinApp theApp;using namespace std;static HANDLE h1;static HANDLE hHandle1=NULL;void func();int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]){int nRetCode = 0;DWORD dwThreadID1;DWORD dRes,err;hHandle1=CreateSemaphore(NULL,0,1,"SemaphoreName1");if (hHandle1==NULL) printf("Semaphore Create Fail!\n");else printf("Semaphore Create Success!\n");hHandle1=OpenSemaphore(SYNCHRONIZE|SEMAPHORE_MODIFY_STATE,NULL," SemaphoreName1");if (hHandle1==NULL) printf("Semaphore Open Fail!\n");else printf("Semaphore Open Success!\n");h1=CreateThread((LPSECURITY_ATTRIBUTES)NULL,0,(LPTHREAD_START_ROUTINE)func,(LPVOID)NULL,0,&dwThreadID1);if (h1==NULL) printf("Thread1 create Fail!\n");else printf("Thread1 create Success!\n");dRes=WaitForSingleObject(hHandle1,INFINITE);err=GetLastError();printf("WaitForSingleObject err=%d\n",err);if (dRes == WAIT_TIMEOUT) printf("TIMEOUT!dRes=%d\n",dRes);else if (dRes == WAIT_OBJECT_0) printf("WAIT_OBJECT!dRes=%d\n",dRes);else if (dRes == WAIT_ABANDONED)printf("WAIT_ABANDONED!dRes=%d\n",dRes);else printf("dRes=%d\n",dRes);CloseHandle(h1);CloseHandle(hHandle1);ExitThread(0);return nRetCode;}void func(){BOOL rc;DWORD err;printf(" Now In Thread !\n");rc=ReleaseSemaphore(hHandle1,1,NULL);err=GetLastError();printf("ReleaseSemaphore err=%d\n",err);if (rc==0) printf("Semaphore Release Fail!\n");else printf("Semaphore Release Success!rc=%d\n",rc);}3.过程截图实验3:线程的互斥1.实验目的(1)熟悉Windows系统环境下线程的创建与撤销。
(2)熟悉Windows系统提供的线程同步API。
(3)使用Windows系统提供的线程同步API解决实际问题。
2.实验要求能正确使用临界区对象,包括初始化临界区InitializeCriticalSection()、进入临界区EnterCriticalSection()、退出临界区LeaveCriticalSection()及删除临界区DeleteCriticalSection(),进一步理解线程的互斥。
代码三:// Mutex.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include "Mutex.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif///////////////////////////////////////////////////////////////////////////// // The one and only application objectCWinApp theApp;using namespace std;static int count=5;static HANDLE h1;static HANDLE h2;LPCRITICAL_SECTION hCriticalSection;CRITICAL_SECTION Critical;void func1();void func2();int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]){int nRetCode = 0;DWORD dwThreadID1,dwThreadID2;hCriticalSection=&Critical;InitializeCriticalSection(hCriticalSection);h1=CreateThread((LPSECURITY_ATTRIBUTES)NULL,0,(LPTHREAD_START_ROUTINE)func1,(LPVOID)NULL,0,&dwThreadID1);if (h1==NULL) printf("Thread1 create Fail!\n");else printf("Thread1 create Success!\n");h2=CreateThread((LPSECURITY_ATTRIBUTES)NULL,0,(LPTHREAD_START_ROUTINE)func2,(LPVOID)NULL,0,&dwThreadID2);if (h2==NULL) printf("Thread2 create Fail!\n");else printf("Thread2 create Success!\n");_sleep(1000);CloseHandle(h1);CloseHandle(h2);DeleteCriticalSection(hCriticalSection);ExitThread(0);return nRetCode;}void func2(){int r2;EnterCriticalSection(hCriticalSection);r2=count;_sleep(100);r2=r2+1;count=r2;printf("count in func2=%d\n",count);LeaveCriticalSection(hCriticalSection); }void func1(){int r1;EnterCriticalSection(hCriticalSection);r1=count;_sleep(500);r1=r1+1;count=r1;printf("count in func1=%d\n",count);LeaveCriticalSection(hCriticalSection); }3.过程截图:实验心得:之前做这三个实验的时候运行一直失败,只显示‘Hello From MFC’,经过几番查询还是无法解决。