资源简介
教材中对读者写者问题算法均有描述,但这个算法在不断地有读者流的情况下,写者会被阻塞。编写一个写者优先解决读者写者问题的程序,其中读者和写者均是多个进程,用信号量作为同步互斥机制。
代码片段和文件信息
#include “stdio.h“
#include
#include
#include
#include
#include
#include
#define SHM_MODE 0600
#define SEM_MODE 0600
#define SHM_SIZE (1024*1024)
#define SIGNAL_NUM 4
#define read 1
#define writemutex 1
#define write 1
#define readmutex 1
#define sem_id_read 0
#define sem_id_readmutex 1
#define sem_id_write 2
#define sem_id_writemutex 3
#if defined(__GNU_LIBRARY__) && !defined(_SEM_SEMUN_UNDEFINED)
/* union semun is defined by including */
#else
/* according to X/OPEN we have to define it ourselves */
union semun{
int val;
struct semid_ds *buf;
unsigned short *array;
};
#endif
struct ShM{
int readcount;
int writecount;
}*pSM;
int shmId = -1 semSetId = -1;
union semun su;//sem union,用于初始化信号量
void waitSem(int semSetId int semNum)
{
struct sembuf sb;
sb.sem_num = semNum;
sb.sem_op = -1;//表示要把信号量减一
sb.sem_flg = SEM_UNDO;//
//第二个参数是 sembuf [] 类型的,表示数组
//第三个参数表示 第二个参数代表的数组的大小
if (semop(semSetId &sb 1) < 0){
perror(“waitSem failed“);
exit(1);
}
}
void sigSem(int semSetId int semNum){
struct sembuf sb;
sb.sem_num = semNum;
sb.sem_op = 1;
sb.sem_flg = SEM_UNDO;
if (semop(semSetId &sb 1) < 0){
perror(“waitSem failed“);
exit(1);
}
}
void init(){
//缓冲区分配以及初始化
if ((shmId = shmget(IPC_PRIVATE SHM_SIZE SHM_MODE)) < 0)
{
perror(“create shared memory failed“);
exit(1);
}
pSM = (struct ShM *)shmat(shmId 0 0);
pSM->writecount = 0;
pSM->readcount = 0;
//信号量创建
//第一个:同步信号量表示读者信号量,用于与第一个写者与读者互斥
//第二个:互斥信号量表示写者进程数变量writecount的临界区
//第三个:同步信号量表示写者信号量,用于与写者互斥,第一个读者与写者互斥
//第四个:互斥信号量 ,表示读者进程数变量readcount的临界区
if ((semSetId = semget(IPC_PRIVATE SIGNAL_NUM SEM_MODE)) < 0)
{
perror(“create semaphore failed“);
exit(1);
}
//信号量初始化其中 su 表示 union semun
su.val = read;//表示读者信号量,用于与第一个写者与读者互斥
if (semctl(semSetId sem_id_read SETVAL su) < 0){
perror(“semctl failed“);
相关资源
- kali Linux全套视频加工具学习资料
- linux黑客编程之路
- linux下面使用SIM300模块发送GPRS短信的
- unix-linux编程实践教程习题解答及代码
- 使用信号量实现有限缓冲区的生产者
- linuxubuntu下ffmpeg + alsa 的音频播放器
- linux 360wifi3代驱动
- 使用共享内存及信号量实现进程间通
- gt911触摸屏驱动程序
- 多线程扫描工具
- SSH Secure远程链接工具
- 良哥独创Linux deepin电脑系统装回wind
- linuxdos(Explore2fs)一个windows系统下查
- Arm-linux 自定义开机启动程序,避开从
- Linux内核WIFI驱动详细源码
- linux2.6.11.12内核源码注释
- linux运维之道144632
- 《Xilinx ZYNQ-7000 AP SoC开发实战指南》符
- Linux教程复习资料以及课后习题答案
- 高通9x07 软件架构及用户指导 mdm9x07
- Qt 拼音输入法
- 学习Linux的一些笔记.docx
- awl-0.2.tar.gz TCP SYN洪水攻击 linux工具
- 西北农林科技大学操作系统实验一-
- 《网络服务器搭建与配置》实训指导
- Delphi.High.Performance.Applications.Concurren
- Kettle在Linux的安装使用
- 基于GEC210的语音识别控制
- linux基础培训.pdf
- Qt5的多线程小程序,实现按钮开关线
评论
共有 条评论