- 1、本文档共12页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
实验六 信号量
厦门大学软件学院
吴清强
实验目的
加强对进程概念的理解。
进一步了解并发执行的实质。
分析进程争用资源的现象,学习解决进程互斥的方法
了解Linux系统中进程通信的基本原理
二.相关知识
进程的概念。
进程与程序的区别。
进程并发执行的概念。
进程互斥的概念
进程通信的基本原理
三.实验内容
使用信号量实现有限缓冲区的生产者和消费者问题
使用信号量实现读进程具有优先权的读者和写者问题
四.实验环境
PC + Linux Red Hat操作系统
GCC
1. 使用信号量实现有限缓冲区的生产者和消费者问题
程序流程图
开 始
开 始
是
该缓冲区是否已上锁?
是否有空缓冲区?
否
是
对该缓冲区上锁
模拟生产
解 锁
结 束
阻 塞
否
生产者进程生产流程图
开 始
开 始
是
该缓冲区是否已上锁?
是否有满缓冲区?
否
是
对该缓冲区上锁
模拟消费
解 锁
结 束
阻 塞
否
消费者进程消费流程图
源代码
1、生产者生产进程函数
DWORD WINAPI Producer(LPVOID lpParameter){
while(true){
for(int j=0;j4;j++){
if(buffer[j]==0){//找到空缓冲区
if(lock[j]==false){//同步锁为false,可以进行操作
lock[j]=true;//加锁,防止其他线程操作此缓冲区
if(buffer[j]1){//限定一个缓冲区只能存放一个资源
++buffer[j];//模拟生产资源
cout生产一个资源,放入缓冲区j中endl;
lock[j]=false;//解锁
break;//一次生产一个
}
}
if(j==3){
cout找不到空缓冲区,等待中。。endl;
Sleep(2000);
}
}
}
}
return 0;
}
2、消费者消费进程函数
DWORD WINAPI Customer(LPVOID lpParameter)
{
while(true){
for(int n=0;n4;n++){
if(buffer[n]==1){//找到满缓冲区
if(lock[n]==false){//同步锁为false,可以进行操作
lock[n]=true;//加锁,防止其他线程操作此缓冲区
if(buffer[n]=1){
--buffer[n];//模拟消费资源
cout消费一个资源,从缓冲区n中取出endl;
lock[n]=false;//解锁
break;//一次生产一个
}
}
}
if(n==3){
cout找不到满缓冲区,等待中。。endl;
Sleep(2000);
}}}}
3、主函数,创建5个进程,其中3个生产者进程,2个消费者进程
int main(int argc,char* argv[])
{
HANDLE handle[3];
DWORD dw1,dw2,dw3,dw4,dw5;//创建5个进程
handle[0]=CreateThread(NULL,0,Producer,NULL,0,dw1);
handle[1]=CreateThread(NULL,0,Producer,NULL,0,dw2);
handle[2]=CreateThread(NULL,0,Producer,NULL,0,dw3);
handle[3]=CreateThread(NULL,0,Customer,NULL,0,dw4);
handle[4]=CreateThread(NULL,0,Customer,NULL,0,dw5);
}
·三、 试验结果
3个生产者2个消费者,共享4个缓冲区,运行结果如下:
1、一个生产者生产,一个消费者消费:
两个生产者连续生产,两个消费者连续消费:
多个生产者于多个消费者进行生产消费操作:
2. 使用信号量实现读进程具有优先权的读者和写者问题
.
程序流程图
源代码
#includeunistd.h
#includesys/types.h
#includesys/sem.h
#includesys/mman.h
#includesys/ipc.h
#includestdio.h
int *critica
文档评论(0)