OS进程同步实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
}
阅读、调试、运行、分析程序,写出运行结果,这个结果与你期望的一致吗?(从进程并发的角度对结果进行分析)
思考题
1.分析进程与线程创建及控制的异同。
(1)调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位
(2)并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行
(3)拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源.
(4)系统开销:在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。
2.分析线程各API函数的功能及使用方法。
线程创建函数:CreateThread()
获得线程优先级函数:GetThreadPriority()
设置线程优先级函数:SetThreadPriority()
判断线程当前是否处于运行状态函数:GetExitCodeThread()
获得线程标识符函数:GetCurrentThreadID()
ResumeThread()
用于挂起线程的函数:SuspendThread()
终止线程函数:ExitThread()
终止线程函数:TerminateThread()
实验过程与结果:
程序4_1
两个线程无同步代码,观察 i 值。
#include <iostream.h>
#include <windows.h>
#define M 90000 // 循环次数要很大,可多次尝试一些值int i = 0;
DWORD _stdcall fun1( LPVOID p1)
{ for( int j =0 ;j < M;j++) i++;
return 0;
}
DWORD _stdcall fun2( LPVOID p1)
{ for( int j =0 ;j < M;j++) i--;
return 0;
}
int main()
{ DWORD id1,id2;
HANDLE hThread[2];
hThread[0] = CreateThread(0,0,fun1,0,0,&id1);
hThread[1] = CreateThread(0,0,fun2,0,0,&id2);
WaitForMultipleObjects(2, // 等待句柄的数量
hThread, //句柄数组的指针1, //TRUE等待所有对象,FALSE第一个信号到来就向下执行INFINITE); //一直等待
cout<<"i = "<<i<<endl;
return 0;
}
InitializeCriticalSection(&cs);
hThread[0] = CreateThread(0,0,fun1,0,0,&id1);
hThread[1] = CreateThread(0,0,fun2,0,0,&id2);
WaitForMultipleObjects(2,hThread,1,INFINITE);
cout<<"i = "<<i<<endl;
DeleteCriticalSection(&cs);
return 0;
}
无论如何执行,i的值总是0,结果是正确的。
程序4_3
利用互斥体保护共享资源
#include <iostream.h>
#include <windows.h>
int i=0;
const int M=9000000;
HANDLE hMutex;
DWORD WINAPI fun1( LPVOID p1)
{ for( int j =0 ;j < M;j++){
WaitForSingleObject(hMutex, INFINITE) ;
i++;
ReleaseMutex(hMutex) ;
}
return 0;
}
DWORD _stdcall fun2( LPVOID p1)
{ for( int j =0 ;j < M;j++){
WaitForSingleObject(hMutex, INFINITE) ;
i--;
ReleaseMutex(hMutex) ;
}
return j;
}
int main()
{ DWORD id1,id2;
HANDLE hThread[2] ;
hMutex = CreateMutex(
NULL, // 缺省的安全属性,句柄不被子进程继承 FALSE, // 只初始化,不拥有
NULL) ; // 匿名的
hThread[0] = CreateThread(0,0,fun1,0,0,&id1);
hThread[1] = CreateThread(0,0,fun2,0,0,&id2);
WaitForMultipleObjects(2,hThread,1,INFINITE);
cout<<"i = "<<i<<endl;
ReleaseMutex(hMutex) ;
CloseHandle(hMutex) ;
return 0;
}
程序4_4:
# include <windows.h>
# include <iostream.h>
HANDLE g_hSemThreads=INVALID_HANDLE_VALUE;
static DWORD WINAPI ThreadProc(LPVOID lpParam)。