c语言p,用C语言实现P、V操作
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
操作系统中关于信号量操作的代码示例(Linux+windows)
原文:操作系统中关于信号量操作的代码示例(Linux+windows)
有一个生产者进程,有两个消费者进程。生产者产生1-100的100个数。两个消费者从共享内存中取数。
/*windows 部分*/
// Thread.cpp : 定义控制台应用程序的入口点。
//-----------Windows下生产者、消费者实例程序---------------------
//--------------author:zhangwei----------------------------------
//--------------Date 12/10/2004---------------------------------
#include "stdafx.h"
//作为仓库存放数据,最多可以放五个数据
int array[5];
//记录生成数据的个数
int pointer;
//记录取得的数据的位置
int pointerget;
//用来保存数据和
int sum;
//临界区对象
CRITICAL_SECTION csArray;
//句柄,保存Full信号量
HANDLE hFull;
//句柄,保存Empty信号量
HANDLE hEmpty;
//生产者函数
DWORD WINAPI Producer(LPVOID lpParam)
{
int i = 0;
pointer = 0;
while( i
{
WaitForSingleObject(hEmpty,INFINITE);
EnterCriticalSection( &csArray);
array[(pointer++)%5] = i + 1;
LeaveCriticalSection( &csArray);
ReleaseSemaphore(hFull,1,NULL);
i++;
}
return 0;
}
//消费者函数A
DWORD WINAPI ConsumerA(LPVOID lpParam)
{
while(1)
{
WaitForSingleObject(hFull,INFINITE);
EnterCriticalSection( &csArray);
sum += array[(pointerget ++ )%5];
printf("ConsumerA get %d \n",array[(pointerget -1)%5]);
if(pointerget == 100)
printf("The sum is %d",sum);
LeaveCriticalSection( &csArray);
ReleaseSemaphore(hEmpty,1,NULL);
}
return 0;
}
//消费者函数B
DWORD WINAPI ConsumerB(LPVOID lpParam)
{
while(1)
{
WaitForSingleObject(hFull,INFINITE);
EnterCriticalSection( &csArray);
sum += array[(pointerget ++ )%5];
printf("ConsumerB get %d \n",array[(pointerget -1 )%5]);
if(pointerget == 100)
printf("The sum is %d",sum);
LeaveCriticalSection( &csArray);
ReleaseSemaphore(hEmpty,1,NULL);
}
return 0;
}
//主函数
void main()
{
HANDLE hThreadProducer,hThreadConsumerA,hThreadComsumerB;
sum = 0;
pointerget = 0;
InitializeCriticalSection( &csArray);
hFull = CreateSemaphore(NULL,0,5,NULL);
hEmpty = CreateSemaphore(NULL,5,5,NULL);
hThreadProducer = CreateThread(NULL,0,
Producer,NULL,0,NULL);
hThreadConsumerA = CreateThread(NULL,0,
ConsumerA,NULL,0,NULL);
hThreadComsumerB = CreateThread(NULL,0,
ConsumerB,NULL,0,NULL);
_getch();
}
/*Linux 部分*/
#include
#include
#include
#include
#include
#include
#include
#include
#define MAXSEM 5
//声明三个信号灯ID
int fullid;
int emptyid;
int mutxid;
int main()
{
struct sembuf P,V;;
union semun arg;
//声明共享内存
int *array;
int *sum;
int *set;
int *get;
//映射共享内存
array = (int *)mmap(NULL , sizeof( int )*5,PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANONYMOUS,-1,0);
sum = (int *)mmap(NULL , sizeof( int ),PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANONYMOUS,-1,0);
get = (int *)mmap(NULL , sizeof( int ),PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANONYMOUS,-1,0);
set = (int *)mmap(NULL , sizeof( int ),PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANONYMOUS,-1,0);
*sum = 0;
*get = 0;
*set = 0;
//生成信号灯
fullid= semget(IPC_PRIVATE,1,IPC_CREAT|00666);
emptyid=semget(IPC_PRIVATE,1,IPC_CREAT|00666);
mutxid=semget(IPC_PRIVATE,1,IPC_CREAT|00666);
//为信号灯赋值
arg.val = 0;
if(semctl(fullid , 0 , SETVAL , arg) == -1) perror("semctl setval error");
arg.val = MAXSEM;
if(semctl(emptyid , 0 ,SETVAL , arg) == -1) perror("semctl setval error");
arg.val = 1;
if(semctl(mutxid , 0 ,SETVAL , arg) == -1) perror("setctl setval error");
//初始化P,V操作
V.sem_num=0;
V.sem_op =1;
V.sem_flg=SEM_UNDO;
P.sem_num=0;
P.sem_op =-1;
P.sem_flg=SEM_UNDO;
//生产者进程
if(fork() == 0 ) {
int i = 0;
while( i
{
semop(emptyid , &P ,1 );
semop(mutxid , &P , 1);
array[*(set)%MAXSEM] = i + 1;
printf("Producer %d\n", array[(*set)%MAXSEM]);
(*set)++;
semop(mutxid , &V , 1);
semop(fullid , &V , 1);
i++;
}
sleep(10);
printf("Producer is over");
exit(0);
}else {
//ConsumerA 进程
if(fork()==0) {
while(1){
semop(fullid , &P , 1);
semop(mutxid , &P , 1);
if(*get == 100)
break;
*sum += array[(*get)%MAXSEM];
printf("The ComsumerA Get Number %d\n", array[(*get)%MAXSEM] );
(*get)++;
if( *get ==100)
printf("The sum is %d \n ", *sum);
semop(mutxid , &V , 1);
semop(emptyid , &V ,1 );
sleep(1);
}
printf("ConsumerA is over");
exit(0);
}else {
//Consumer B进程
if(fork()==0) {
while(1){
semop(fullid , &P , 1);
semop(mutxid , &P , 1);
if(*get == 100)
break;
*sum += array[(*get)%MAXSEM];
printf("The ComsumerB Get Number %d\n", array[(*get)%MAXSEM] );
(*get)++;
if( *get ==100)
printf("The sum is %d \n ", *sum);
semop(mutxid , &V , 1);
semop(emptyid , &V ,1 );
sleep(1);
}
printf("ConsumerB is over");
exit(0);
}
}
}
// sleep(20);
return 0;
}
我的第一篇文章,多多指教。如需练习mail:dawei_zhang81@163.com
c语言p,用C语言实现P、V操作相关推荐
- r语言 断轴 画图_R语言基础画图/绘图/作图
R语言基础画图 R语言免费且开源,其强大和自由的画图功能,深受广大学生和可视化工作人员喜爱,这篇文章对如何使用R语言作基本的图形,如直方图,点图,饼状图以及箱线图进行简单介绍. 0 结构 每种图形构成 ...
- c语言 字母 八进制表示'/1011',C语言C语言第一课:C语言概述为什么学习C语言怎样学习C语言.DOC...
[摘要]C语言 第一课: C语言概述 为什么学习C语言 怎样学习C语言 参考资料 ----------------------------------------------------------- ...
- 学单片机需要多少C语言基础,C语言单片机编程教程
很多学员和朋友经常找我给他们推荐C语言的书,他们可能想和我当年一样,闷头大干一场,学个几个月的C语言,把C语言吃透,再开始单片机程序开发! 别!别!别! 大家千万别这么干,我当年自学了3个月的C语言, ...
- 为什么可以说Java语言是准动态语言?
什么是动态语言? 动态语言,是指程序在运行时可以改变其结构:新的函数可以被引进,已有的函数可以被删除等在结构上的变化.比如JavaScript便是一个典型的动态语言. 除此之外如Ruby.Python ...
- c语言课件 文件,C语言课件--文件.ppt
C语言课件--文件 例12-5 /*将字符串"apple", "grape", "pear" 写入到磁盘文件f12-5.txt中,然后再从该 ...
- python和c哪个适合入门-编程入门选什么语言好?C 语言还是Python ?为你解析
前面我分享过计算机行业已经成了学校选择排名第一,家长和学生都很看好计算机类专业.现在IT行业也越来越火爆,程序员越来越被人看好.面对相比同龄人高薪资的诱惑,人们很难不心动,即使秃头也值得! 那么问题来 ...
- python叫什么语言-python是什么语言编写的
python是什么语言编写的? python是C语言编写的. 自从20世纪90年代初Python语言诞生至今,它已被逐渐广泛应用于系统管理任务的处理和Web编程. Python的创始人为荷兰人吉多·范 ...
- 以下哪一个不属于python语言的特点-Python语言的特点有哪些
Python语言的特点有哪些 Python 是目前最流行的语言之一,从云计算.大数据到人工智能,Python 无处不在,Python 人才需求量也在逐年攀升,Python 为何能发展如此的迅猛,究竟有 ...
- 【计算理论】可判定性 ( 计算模型与语言 | 区分 可计算语言 与 可判定语言 | 证明 通用图灵机语言是 可计算语言 | 通用任务图灵机 与 特殊任务图灵机 )
文章目录 一.计算模型与语言 二.区分 可计算语言 与 可判定语言 三.证明 ATM\rm A_{TM}ATM 语言 可计算 四.通用 ( Universal ) 任务图灵机 与 特殊任务图灵机 一 ...
- 【计算理论】正则语言 ( 正则表达式原子定义 | 正则表达式递归定义 | 正则表达式语言原子定义 | 正则表达式语言结构归纳 | 正则表达式语言示例 | 根据正则表达式构造自动机 )
文章目录 一.正则表达式 定义 二. 正则表达式语言 原子定义 三.正则表达式语言 结构归纳定义 四.正则表达式语言 示例 五.空集 ∅\varnothing∅ 与 空字符 ε\varepsilonε ...
最新文章
- 若依框架使用数据权限
- python写名片管理系统_Python实现名片管理系统
- COCO数据集提取自己需要的类,转VOC
- leetcode 【 Sort List 】 python 实现
- 玩转springboot2.x之搭建Thymeleaf官方示例程序
- Java中的Random()函数 【转载】
- Android实践--监測网络状态
- nginx做代理上网
- list_for_each_entry和list_for_each_entry_safe
- 【Linux】Linux根据文件路径查找索引节点
- 海量数据搜索——搜索引擎
- 对比修改过的两个BOM表
- 满满干货!15个经典面试问题及答案
- 【空气质量数据分析专题三】优良率年际变化分析
- wifi握手包自动跑包
- 酷比魔方iWork10pro安卓root+单系统+双系统恢复教程(理论适配所有x86安卓root)
- Java岗面试题--Java基础(日积月累,每日三题)
- 智能化安防视频监控行业发展是如何转变的?
- 数据结构 - 环形队列
- 位置式Pid和增量式Pid的定义及应用
热门文章
- css 剪辑图片_CSS clip:rect 矩形剪裁功能,截取图片某一块
- acrobat xi pro 简体中文语言支持包_性能出众佳能PRO-561绘图仪西安优杰报价
- 【学习笔记】新基建/新动能——部分学习笔记
- 【转】登录后自动显示未读快件
- 26、Power Query-日期与时间数据处理实例(统计出某年各月各周的借书人数)
- 企业SAP的二次开发管理之路
- SAPScript和Smartform双面打印
- 那些不敢生孩子的女人,都在怕什么?
- 良品铺子,互联网经济下的“两元店”
- 转型会员制,云集能否讲好电商下半场故事?