.. . .. .
成绩:
实 验 报 告
课程名称: 操作系统 实验项目: windows进程管理
姓 名:
专 业: 计算机科学与技术
班 级: 学 号:
计算机科学与技术学院
计算机系
2019 年 4 月 23 日
.. v .. .
.. . .. .
实验项目名称: windows进程管理
一、实验目的
1. 学习windows系统提供的线程创建、线程撤销、线程同步等系统调用; 2. 利用C++实现线程创建、线程撤销、线程同步程序; 3. 完成思考、设计与练习。
二、实验用设备仪器及材料
1. Windows 7或10, VS2010及以上版本。
三、实验内容
1 线程创建与撤销
写一个windows控制台程序(需要MFC),创建子线程,显示Hello, This is a Thread. 然后撤销该线程。 相关系统调用:
线程创建: CreateThread() 线程撤销: ExitThread() 线程终止: ExitThread(0) 线程挂起: Sleep() 关闭句柄: CloseHandle() 参考代码:
// OS-TEST.cpp : 定义控制台应用程序的入口点。 //
#include \#include \#ifdef _DEBUG
#define new DEBUG_NEW #endif
// 唯一的应用程序对象 CWinApp theApp; using namespace std; void ThreadName1();
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
.. v .. .
.. . .. .
{ 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);
.. v .. .
.. . .. .
}
//getchar(); return nRetCode;
void ThreadName1() { }
运行结果如图所示。
完成以下设计题目:
1. 向线程对应的函数传递参数,如字符串“hello world!”,在线程中显示。 2. 如何创建3个线程A, B, C,并建立先后序执行关系A→B→C。
printf(\
实验内容2 线程同步
完成父线程和子线程的同步。父线程创建子线程后进入阻塞状态,子线程运行完毕后再唤醒。 相关系统调用:
等待对象 WaitForSingleObject(), WaitForMultipleObjects();
信号量对象 CreateSemaphore(), OpenSemaphore(), ReleaseSemaphore(); HANDLE WINAPI CreateSemaphore(
_In_opt_ LPSECURITY_ATTRIBUTES lpSemaphoreAttributes _In_ LONG lInitialCount, _In_ LONG lMaximumCount, _In_opt_ LPCTSTR lpName );
第一个参数:安全属性,如果为NULL则是默认安全属性 第二个参数:信号量的初始值,要>=0且<=第三个参数 第三个参数:信号量的最大值 第四个参数:信号量的名称
返回值:指向信号量的句柄,如果创建的信号量和已有的信号量重名,那么返回已经存在的信号量句柄 参考代码:
// OS-TEST.cpp : 定义控制台应用程序的入口点。 //
.. v .. .
.. . .. .
#include \#include \#ifdef _DEBUG
#define new DEBUG_NEW #endif
// 唯一的应用程序对象 CWinApp theApp; using namespace std; //void ThreadName1(); static HANDLE h1;
static HANDLE hHandle1=NULL; void func();
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) {
h1=CreateThread((LPSECURITY_ATTRIBUTES)NULL,
0,
(LPTHREAD_START_ROUTINE)func, (LPVOID)NULL, 0,
&dwThreadID1); //CREATE CHILD THREAD
hHandle1=OpenSemaphore(SYNCHRONIZE|SEMAPHORE_MODIFY_STATE,
NULL,
L\ //OPEN SEMAPHORE
//hHandle1=CreateSemaphore(NULL,0,1, NULL); // CREATE A SEMAPHORE
hHandle1=CreateSemaphore(NULL,0,1, L\ // CREATE A SEMAPHORE if (hHandle1==NULL) printf(\else printf(\int nRetCode = 0; DWORD dwThreadID1; DWORD dRes,err;
//LPCWSTR lPCWSTR=\
if (hHandle1==NULL) printf(\else printf(\
.. v .. .
windows进程管理实验报告



