1、操作系统原理实 验 教 案(基于 Windows2000/XP 平台)讲授人: 谢士春安排授课时间:2011-2012(一)授课对象:09 计算机科学与技术第 II 页实验项目列表实验一 多线程的创建与撤销实验二 线程的同步实验三 线程的互斥实验四 生产者-消费者问题实验五 进程通信实验六 动态链接库的建立和调试实验七 页面置换算法模拟实验八 文件的三种传输模式及性能比较实验九 磁盘的读写附录部分(可扩充)附录 1 读者-写者问题附录 2 梨子苹果之 PV 操作附录 3 命名管道编程规范附录 4 DLL 编程规范第 1 页实验一 线程的创建与撤销一、实验目的通过本实验熟悉 Windows 系统
2、提供的线程创建与撤销等 API 系统调用,掌握 Windows系统环境下线程的创建与撤销方法。二、实验内容1. 熟悉开发环境 Visual C+ 6.0; 2. Windows 系统环境下线程的创建与撤销方法; 3.编程:在主线程中调用 CreateThread( )创建 1 个子线程,并在子线程中显示类似“Thread is running !”等字样。三、实验准备知识相关的 API 函数的函数原型:1. 线程创建函数 HANDLE CreateThread();HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes, / p
3、ointer to security attributesDWORD dwStackSize, / initial thread stack sizeLPTHREAD_START_ROUTINE lpStartAddress, / pointer to thread functionLPVOID lpParameter, / argument for new threadDWORD dwCreationFlags, / creation flagsLPDWORD lpThreadId / pointer to receive thread ID);线程函数原型 DWORD WINAPI Thr
4、ead1Proc(LPVOID lpParameter ) 2. 线程撤销函数VOID ExitThread(DWORD dwExitCode / exit code for this thread);功能:撤销一个线程。该函数将终止线程的运行,并导致操作系统清除该线程使用的所有操作系统资源。但是,C + +资源(如 C + +类对象)将不被撤消。说明:如果在主线程函数(main 函数)中调用 ExitThread,那么应用程序的主线程将停止运行。但是,如果进程中至少有一个线程还在运行,该进程将不会终止运行。3. 线程终止函数 TerminateThread(); 4. 线程挂起函数 Slee
5、p();进程主动放弃剩余的时间片。 5. 关闭句柄函数 CloseHandle( )。说明:关闭一个对象句柄,只是将相应对象的引用数减一,并不意味着终结该对象,除非引用数减至零。四、程序源代码及注释【主要源代码参考】#include #include static HANDLE hThread1=NULL; /存放创建的子进程的句柄DWORD dwThreadID1; /存放创建的子进程的 IDDWORD WINAPI Thread1Proc( LPVOID ); /子线程函数的声明第 2 页int main() / 主线程 /创建子线程hThread1 = CreateThread(NULL
6、,0, Thread1Proc, NULL, 0, Sleep(5000);CloseHandle(hThread1); / 关闭句柄 ExitThread(0); / 撤销本线程return 0; /子线程的实现DWORD WINAPI Thread1Proc(LPVOID lpParameter ) cout#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif/ The one and only application objectCWinApp theApp;usin
7、g namespace std;const unsigned short SIZE_OF_BUFFER = 10; /缓冲区长度unsigned short ProductID = 0; /这里的产品号和将被消耗的产品号是unsigned short ConsumeID = 0; /为了跟踪产品的存取过程而引入的辅助变量unsigned short in = 0; /缓冲区下标,指向生产者要放产品的缓冲区单元unsigned short out = 0; /缓冲区下标,指向消费者要取产品的缓冲区单元int g_bufferSIZE_OF_BUFFER; /缓冲区是个循环队列bool g_con
8、tinue = true; /总控开关,可随时结束诸进程HANDLE g_hMutex; /互斥信号量句柄,用于诸线程互斥访问缓冲区HANDLE g_hFullSemaphore; /资源信号量句柄,代表缓冲区内已放置的产品数HANDLE g_hEmptySemaphore; /资源信号量句柄,代表缓冲区内空闲的单元数DWORD WINAPI Producer(LPVOID); /生产者线程声明DWORD WINAPI Consumer(LPVOID); /消费者线程声明int _tmain(int argc, TCHAR* argv,TCHAR* envp) int nRetCode=0;g
9、_hMutex = CreateMutex(NULL,FALSE,NULL); /互斥信号量g_hFullSemaphore = CreateSemaphore(NULL,0, /初始缓冲区内无产品SIZE_OF_BUFFER-1,NULL);g_hEmptySemaphore =CreateSemaphore(NULL,SIZE_OF_BUFFER-1, / 初始均是空缓冲区SIZE_OF_BUFFER-1,NULL);/调整下面的数值,可以发现,当生产者个数多于消费者个数时,/生产速度快,生产者经常等待消费者;反之,消费者经常等待 const unsigned short PRODUCER
10、S_COUNT = 3; /生产者的个数const unsigned short CONSUMERS_COUNT = 1; /消费者的个数const unsigned short THREADS_COUNT = PRODUCERS_COUNT+CONSUMERS_COUNT; /总的线程数HANDLE hThreadsTHREADS_COUNT; /诸线程的 handle 表第 12 页DWORD producerIDCONSUMERS_COUNT; /生产者线程的标识符表DWORD consumerIDPRODUCERS_COUNT; /消费者线程的标识符表/创建生产者诸线程for (int
11、 i=0;i#include void FileRW_NoBuffer(const char * source, const char * destination);void main()cout#include void FileRW_Buffer(const char * source, const char * destination);void main()cout#include void FileRW_Asyn(const char * source, const char * destination);void main()cout“Now read a txt file to another file !“endl;FileRW_Asyn(“source.txt“, “asyn.txt“);void FileRW_Asyn(const char * source, const char * destination)HANDLE hSource;HANDLE hDest;DWORD dwRead;DWORD dwWrite;char buf1024;hSource = CreateFile(source,GENERIC_READ,0,NULL,