操作系统实验 P、V原语应用分析

it2025-05-24  21

**

P、V原语应用分析

**

1.实验原理

(1)Windows操作系统中P操作对应的函数是:WaitForSingleObject(),了解此函数的功能; (2)Windows操作系统中V操作对应的函数是:ReleaseSemaphore(),了解此函数的功能; (3)实现P、V操作。

2.实验内容

有两个线程hThread1和hThread2共同使用一个缓冲区资源buffer,线程hThread1负责向buffer中写入字符,线程hThread2负责从buffer中读取字符,并显示出来。这样,线程hThread1对缓冲区buffer的写操作Write()和线程hThread2对缓冲区buffer的读操作Read()就需要互斥使用缓冲区资源buffer了。为了让Write()每次写入的字str[i](i=0…4)一定能被唯一地Read()一次,需要把缓冲区buffer的使用看做对两个资源的操作:缓冲区buffer满和缓冲区buffer空。这样,需要定义两个信号量semaphore1和semaphore2,分别控制对“缓冲区buffer满”和“缓冲区buffer空”这两个资源的互斥使用。只有缓冲区空时可以Write(),缓冲区满时可以Read()。

3.实验源程序代码

#include<windows.h> #include<iostream.h> // 定义两个线程函数Write()和Read() // Read()、Write()函数分别使用VC++的P、V操作WaitForSingleObject()和ReleaseSemaphore() DWORD WINAPI Write(LPVOID lpParameter); DWORD WINAPI Read(LPVOID lpParameter); // 缓冲区资源 unsigned char buffer; // 两个信号量,分别使用缓冲区buffer的两个资源:满和空 // semaphore1 表示缓冲区buffer满,初始值为0,最大值为1 // semaphore2 表示缓冲区buffer空,初始值为1,最大值为1 HANDLE semaphore1; HANDLE semaphore2; //线程句柄 HANDLE hThread1; HANDLE hThread2; void main() { // buffer清空 buffer=' '; // 创建信号量 semaphore1=CreateSemaphore(NULL,0,1,NULL); semaphore2=CreateSemaphore(NULL,1,1,NULL); // 创建线程 hThread1=CreateThread(NULL,0,Write,NULL,0,NULL); hThread2=CreateThread(NULL,0,Read,NULL,0,NULL); // 在子线程执行完前主线程不能退出,否则显示结果异常 Sleep(10000); // 关闭句柄 CloseHandle(Write); CloseHandle(Read); // 释放信号量 CloseHandle(semaphore1); CloseHandle(semaphore2); } // 线程1对应的p函数实体:缓冲区buffer写操作 DWORD WINAPI Write(LPVOID lpParameter) { unsigned char str[6]="Hello"; int i=0; for (i=0;i<5;i++) { // 等待缓冲区空 WaitForSingleObject( semaphore2, INFINITE ); // 缓冲区空时,向缓冲区写入数据 buffer=str[i]; // 通知缓冲区满 ReleaseSemaphore( semaphore1, 1, NULL ); } return 0; } // 线程2对应的V函数实体:缓冲区buffer读操作 DWORD WINAPI Read(LPVOID lpParameter) { int i=1; unsigned char c; for (i=1;i<=5;i++) { // 等待缓冲区满 WaitForSingleObject( semaphore1, INFINITE); // 从缓存buffer获取数据 c=buffer; // 输出从缓冲区buffer取出的数据 cout<<c; // 通知缓冲区空 ReleaseSemaphore( semaphore2, 1, NULL ); } // 回车换行 cout<<endl; return 0; }
最新回复(0)