资源简介
教材中对读者写者问题算法均有描述,但这个算法在不断地有读者流的情况下,写者会被阻塞。编写一个写者优先解决读者写者问题的程序,其中读者和写者均是多个进程,用信号量作为同步互斥机制。
代码片段和文件信息
#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“);
相关资源
- uboot到linux logo显示不间断 补丁
- UNIX/LINUX编程实践教程的源码
- Linux任务管理器
- linux应用层的华容道游戏源代码
- 编写简单的RMI程序 多线程web 服务器
- HOOK小工具(进程、窗口、全局)
- 直观端口查看器,详细显示可疑进程
- ubuntu9.10 可加载内核模块和字符设备驱
- MP3文件ID3v2ID3v2APEv2标签读取
- 内核驱动进程保护演示程序
- 操作系统实验——虚存管理实验
- linux下的发包工具sendip
- HOOK 记录和模拟 Keyboard Mouse
- 尚观培训linux许巍关于c 的笔记和讲义
- 尚观培训linux董亮老师关于数据结构的
- linux 线程池源码 c 版
- linux C 电梯程序练习
- linux下用多进程同步方法解决生产者
- 多线程生产者消费者模式
- 线程同步机制-AutoResetEvent
- Linux 操作系统实验(全)
- Linux From Scratch 中文手册
- linux 网络实验 ftp程序
- Linux命令大全离线版&在线版
- 操作系统共享内存实验
- dos 下运行Linux 命令--gnu_utils
- linux 0.12内核源代码
- linux简易shell C实现
- linux实验报告及心得体会
- 基于GTK的Linux环境下的简易任务管理器
评论
共有 条评论