**
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>
DWORD WINAPI
Write(LPVOID lpParameter
);
DWORD WINAPI
Read(LPVOID lpParameter
);
unsigned char buffer
;
HANDLE semaphore1
;
HANDLE semaphore2
;
HANDLE hThread1
;
HANDLE hThread2
;
void main()
{
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
);
}
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;
}
DWORD WINAPI
Read(LPVOID lpParameter
)
{
int i
=1;
unsigned char c
;
for (i
=1;i
<=5;i
++)
{
WaitForSingleObject( semaphore1
, INFINITE
);
c
=buffer
;
cout
<<c
;
ReleaseSemaphore( semaphore2
, 1, NULL );
}
cout
<<endl
;
return 0;
}