资源简介

教材中对读者写者问题算法均有描述,但这个算法在不断地有读者流的情况下,写者会被阻塞。编写一个写者优先解决读者写者问题的程序,其中读者和写者均是多个进程,用信号量作为同步互斥机制。

资源截图

代码片段和文件信息

#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“);

评论

共有 条评论