資源簡介
教材中對讀者寫者問題算法均有描述,但這個算法在不斷地有讀者流的情況下,寫者會被阻塞。編寫一個寫者優(yōu)先解決讀者寫者問題的程序,其中讀者和寫者均是多個進程,用信號量作為同步互斥機制。
代碼片段和文件信息
#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(){
//緩沖區(qū)分配以及初始化
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;
//信號量創(chuàng)建
//第一個:同步信號量表示讀者信號量,用于與第一個寫者與讀者互斥
//第二個:互斥信號量表示寫者進程數變量writecount的臨界區(qū)
//第三個:同步信號量表示寫者信號量,用于與寫者互斥,第一個讀者與寫者互斥
//第四個:互斥信號量?,表示讀者進程數變量readcount的臨界區(qū)
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“);
評論
共有 條評論