实验项目名称: Windows进程管理
一、实验目的
1、学习windows系统提供的线程创建、线程撤销、线程同步等系统调用;
2、利用C++实现线程创建、线程撤销、线程同步程序;
3、完成思考、设计与练习。
二、实验内容
1、写一个windows控制台程序(需要MFC),创建子线程,显示Hello, This is a Thread. 然后撤销该线程。
2、向线程对应的函数传递参数,如字符串“hello world!”,在线程中显示。
3、如何创建3个线程A, B, C,并建立先后序执行关系A→B→C。
4、完成父线程和子线程的同步。父线程创建子线程后进入阻塞状态,子线程运行完毕后再唤醒。
三、实验原理
相关系统调用:
线程创建: CreateThread()
线程撤销: ExitThread()
线程终止: ExitThread(0)
线程挂起: Sleep()
关闭句柄: CloseHandle()
等待对象 WaitForSingleObject(), WaitForMultipleObjects();
信号量对象 CreateSemaphore(), OpenSemaphore(), ReleaseSemaphore();
HANDLE WINAPI CreateSemaphore(
In_opt LPSECURITY_ATTRIBUTES lpSemaphoreAttributes
In LONG lInitialCount,
In LONG lMaximumCount,
In_opt LPCTSTR lpName
);
四、实验代码
(1)创建线程
#include “stdafx.h”
#include “OS-TEST.h”

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

// 唯一的应用程序对象

CWinApp theApp;

using namespace std;
void ThreadName1();

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;
static HANDLE hHandle1=NULL;
DWORD dwThreadID1;
HMODULE hModule = ::GetModuleHandle(NULL);

if (hModule != NULL)
{// 初始化 MFC 并在失败时显示错误if (!AfxWinInit(hModule, NULL, ::GetCommandLine(), 0)){// TODO: 更改错误代码以符合您的需要_tprintf(_T("错误: MFC 初始化失败\n"));nRetCode = 1;}else{// TODO: 在此处为应用程序的行为编写代码。}
}
else
{// TODO: 更改错误代码以符合您的需要_tprintf(_T("错误: GetModuleHandle 失败\n"));nRetCode = 1;
}
hHandle1=CreateThread((LPSECURITY_ATTRIBUTES) NULL,0,(LPTHREAD_START_ROUTINE) ThreadName1,(LPVOID) NULL,0,&dwThreadID1);
Sleep(5000);
CloseHandle(hHandle1);
ExitThread(0);//getchar();
return nRetCode;

}
void ThreadName1()
{
printf(“Hello, This is a Thread.”);
}

(2)撤销线程
#include “stdafx.h”
#include “OS-TEST.h”

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

// 唯一的应用程序对象

CWinApp theApp;

using namespace std;
void ThreadName1();

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;
static HANDLE hHandle1=NULL;
DWORD dwThreadID1;
HMODULE hModule = ::GetModuleHandle(NULL);
if (hModule != NULL)
{
// 初始化 MFC 并在失败时显示错误
if (!AfxWinInit(hModule, NULL, ::GetCommandLine(), 0))
{
// TODO: 更改错误代码以符合您的需要
_tprintf(_T(“错误: MFC 初始化失败\n”));
nRetCode = 1;
}
else
{
// TODO: 在此处为应用程序的行为编写代码。
}
}
else
{
_tprintf(_T(“错误: GetModuleHandle 失败\n”));
nRetCode = 1;
}
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(“hello world!”);
}
(3)线同步
#include “stdafx.h”
#include “afxwinappex.h”
#include “afxdialogex.h”
#include “os实验一.h”
#include “MainFrm.h”
#include “os实验一Doc.h”
#include “os实验一View.h”
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
using namespace std;
void ThreadName1();
void ThreadName2();
void ThreadName3();
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;
static HANDLE hHandle1=NULL;
static HANDLE hHandle2=NULL;
static HANDLE hHandle3=NULL;
DWORD dwThreadID1;
HMODULE hModule = ::GetModuleHandle(NULL);
if (hModule != NULL)
{
// 初始化 MFC 并在失败时显示错误
if (!AfxWinInit(hModule, NULL, ::GetCommandLine(), 0))
{
// TODO: 更改错误代码以符合您的需要
_tprintf(_T(“错误: MFC 初始化失败\n”));
nRetCode = 1;
}
else
{
// TODO: 在此处为应用程序的行为编写代码。
}
}
else
{
_tprintf(_T(“错误: GetModuleHandle 失败\n”));
nRetCode = 1;
}
hHandle1=CreateThread((LPSECURITY_ATTRIBUTES) NULL,
0,
(LPTHREAD_START_ROUTINE) ThreadName1,
(LPVOID) NULL,
0,
&dwThreadID1);
hHandle2=CreateThread((LPSECURITY_ATTRIBUTES) NULL,
0,
(LPTHREAD_START_ROUTINE) ThreadName2,
(LPVOID) NULL,
0,
&dwThreadID1);
hHandle3=CreateThread((LPSECURITY_ATTRIBUTES) NULL,
0,
(LPTHREAD_START_ROUTINE) ThreadName3,
(LPVOID) NULL,
0,
&dwThreadID1);
Sleep(50000);
CloseHandle(hHandle1);
CloseHandle(hHandle2);
CloseHandle(hHandle3);
ExitThread(0);

//getchar();
return nRetCode;

}

void ThreadName1()
{
printf(“hello world!\n”);
}
void ThreadName2()
{
printf(“How do Pikachu walk? \n”);
}
void ThreadName3()
{
printf(“Pika Ping, Pika Pong!\n”);
}
using namespace std;
void ThreadName1();
static HANDLE h1;
static HANDLE h2;
static HANDLE h3;
static HANDLE hHandle1=NULL;

void func();
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;
DWORD dwThreadID1;
DWORD dwThreadID2;
DWORD dwThreadID3;
DWORD dRes,err;
//LPCWSTR lPCWSTR=“SemaphoreName1”;

//hHandle1=CreateSemaphore(NULL,0,1, NULL);  // CREATE A SEMAPHORE
hHandle1=CreateSemaphore(NULL,0,1, L"SemaphoreName1");  // CREATE A SEMAPHORE
if (hHandle1==NULL) printf("Semaphore create ERR!\n");
else printf("Semaphore create success!\n");hHandle1=OpenSemaphore(SYNCHRONIZE|SEMAPHORE_MODIFY_STATE,NULL,L"SemaphoreName1");                     //OPEN SEMAPHORE
if (hHandle1==NULL) printf("Semaphore open ERR!\n");
else printf("Semaphore open success!\n");h1=CreateThread((LPSECURITY_ATTRIBUTES)NULL,0,(LPTHREAD_START_ROUTINE)func,(LPVOID)NULL,0,&dwThreadID1);                //CREATE CHILD THREAD
if (h1==NULL) printf("Thread1 create ERR!\n");
else printf("Thread1 create success!\n");dRes=WaitForSingleObject(hHandle1,INFINITE);  //WAIT FOR CHILD THREAD END
err=GetLastError();
printf("Wait for single object ERR=%d\n",err);if(dRes==WAIT_TIMEOUT)printf("TIMEOUT OF 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);Sleep(10000);
CloseHandle(h1);//==================================================================================
h2=CreateThread((LPSECURITY_ATTRIBUTES)NULL,0,(LPTHREAD_START_ROUTINE)func,(LPVOID)NULL,0,&dwThreadID2);                //CREATE CHILD THREAD
if (h2==NULL) printf("Thread2 create ERR!\n");
else printf("Thread2 create success!\n");dRes=WaitForSingleObject(hHandle1,INFINITE);  //WAIT FOR CHILD THREAD END
err=GetLastError();
printf("Wait for single object ERR=%d\n",err);if(dRes==WAIT_TIMEOUT)printf("TIMEOUT OF 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);Sleep(10000);
CloseHandle(h2);h3=CreateThread((LPSECURITY_ATTRIBUTES)NULL,0,(LPTHREAD_START_ROUTINE)func,(LPVOID)NULL,0,&dwThreadID3);                //CREATE CHILD THREAD
if (h3==NULL) printf("Thread3 create ERR!\n");
else printf("Thread3 create success!\n");dRes=WaitForSingleObject(hHandle1,INFINITE);  //WAIT FOR CHILD THREAD END
err=GetLastError();
printf("Wait for single object ERR=%d\n",err);if(dRes==WAIT_TIMEOUT)printf("TIMEOUT OF 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);Sleep(10000);
CloseHandle(h3);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("Release Semaphore err=%d\n",err);
if(rc==0) printf("Semaphore Release Fail.\n");
else printf("Semaphore Release Success. rc=%d\n",rc);

}

操作系统实验:Windows进程管理相关推荐

  1. 操作系统实验二 进程管理

    进程管理 一.实验目的 1. 理解进程的概念,明确进程和程序的区别. 2. 理解并发执行的实质. 3. 掌握进程的创建.睡眠.撤销等进程控制方法. 二.实验内容与基本要求 用C语言编写程序,模拟实现创 ...

  2. 操作系统——实验二 进程管理

    1.实验目的 (1)加深对进程概念的理解,明确进程和程序的区别. (2)进一步认识并发执行的实质. (3)分析进程竞争资源现象,学习解决进程互斥的方法. 2.实验预备内容 (1)阅读Linux的sch ...

  3. 计算机操作系统实验二 进程管理

    一.实验目的 1.掌握进程的概念,明确进程的含义 2.认识并了解并发执行的实质 二.实验内容 1.编写一段程序,使用系统调用fork( )创建两个子进程.当此程序运行时,在系统中有一个父进程和两个子进 ...

  4. 操作系统 实验一 进程管理与进程同步

    理解安全性算法和银行家算法的核心机制: 针对3类资源.5个进程的情况,设计相应的数据结构,分别表示每个进程占用各类资源的情况: 编程实现安全性算法函数,编制主函数,动态输入资源的占用情况,进程的资源申 ...

  5. 操作系统课设之Windows 进程管理

    前言 课程设计开始了,实验很有意思,写博客总结学到的知识 白嫖容易,创作不易,学到东西才是真 本文原创,创作不易,转载请注明!!! 本文链接 个人博客:https://ronglin.fun/arch ...

  6. 操作系统实验一 Linux基本操作|实验二 进程管理

    由于当时没存代码,只有实验文档代码截图,文末也可直接获取实验文档. 操作系统实验 目录 实验一 Linux基本操作 实验二进程管理 实验一 Linux基本操作 1实验目的 1.熟悉在Linux操作系统 ...

  7. windows进程管理问题

    Windows进程管理 Windows 所创建的每个进程都从调用CreateProcess()API函数开始, 其函数的任务是在对象管理器子系统内初始化进程对象. 每一个进程都以调用ExitProce ...

  8. linux进程管理命令实验,实验2Linux进程管理.doc

    实验2Linux进程管理 实验2 Linux进程管理 实验目的 1.加深对进程概念的理解,明确进程和程序的区别 2.进一步认识并发执行的实质 3.分析进程争用资源的现象,学习解决进程互斥的方法 实验性 ...

  9. (王道408考研操作系统)第二章进程管理-第三节10:经典同步问题之哲学家进餐问题

    本文接: (王道408考研操作系统)第二章进程管理-第三节6:经典同步问题之生产者与消费者问题 ((王道408考研操作系统)第二章进程管理-第三节7:经典同步问题之多生产者与多消费者问题 (王道408 ...

最新文章

  1. Spring学习4之依赖注入(DI)
  2. mysql数据通讯方式_c# 与 Mysql 的通讯方式总结
  3. 通过在Global.asax文件中配置Application来统计的方法
  4. 企业级分布式 HTAP 数据库管理系统,腾讯 TBase 正式开源 ​
  5. C语言程序项目计划书,(C语言程序设计课程设计计划书.doc
  6. Python3 写入文件
  7. 雨林木风YN9.9三分极速速终结版 http://www.51ylmf.cn
  8. vue结合vue-amap调用高德地图行政区划分并添加标记点
  9. linux系统pyodbc安装与使用教程
  10. opencv学习日记
  11. u深度重装系统详细教程_u深度u盘怎么安装深度xp系统?u深度u盘装系统教程
  12. 牛客网练习—《网络基础》DAY3
  13. 猜年龄python实现
  14. String.length() 与 String.getBytes().length
  15. 人人公司启动史上最大规模校园招聘
  16. (附源码)小程序 美食教程小程序 毕业设计 190900
  17. java ctr_AES CTR加密模式有iv向量吗?求java实现ctr加解密代码?
  18. PyTorch之填充操作
  19. 【收藏】构建属于自己的云端知识库——语雀
  20. 事务统计系统软件 php,PHP数据库事务处理

热门文章

  1. 太原理工大学计算机软件基础考试,太原理工大学考试《大学计算机基础》A考题.pdf...
  2. vue中插值表达式和14个vue指令详解
  3. 知识图谱嵌入内容整理
  4. 测试工具基础------Selenium常用定位方法
  5. Android使用webview获取百度百家号网站源码
  6. 荷兰Flexible Optical B.V (OKO)公司
  7. 2023最新SSM计算机毕业设计选题大全(附源码+LW)之java班级事务管理系统n2tzw
  8. 计算机专业考研新增院校,计算机技术专业考研院校排名
  9. 计算机名师工作室活动个人总结,【音乐工作室总结】_音乐名师工作室年度总结_一起去留学网...
  10. 强连通 Tarjan+Kosaraju (HDU1269+hdu3836)