pomoč pri semaforjih
Robert01
Član
mam en problem z nalogo s semaforji in nwm kak se je naj lotim oz če kdo zna bi prosil da jo resi
Napišite program proizvajalecPotrosnik.c, kjer podamo argument m (m>10) in predstavlja število proizvodov. Pri nalogi najprej realizirajte funkciji W(id) in S(id). S funkcijo W(id) vstopimo v kritično sekcijo, s funkcijo S(id) izstopimo iz kritične sekcije (pri vsakem branju in pisanju). Funkciji W in S realizirajte z uporabo semaforjev, pri čemer je id identifikator semaforja, ki ga uporabljamo. V skupnem pomnilniku imejte naslednjo strukturo (vaš kritični odsek) (uporabite funkcije za delo s skupnim pomnikom):
Napišite program proizvajalecPotrosnik.c, kjer podamo argument m (m>10) in predstavlja število proizvodov. Pri nalogi najprej realizirajte funkciji W(id) in S(id). S funkcijo W(id) vstopimo v kritično sekcijo, s funkcijo S(id) izstopimo iz kritične sekcije (pri vsakem branju in pisanju). Funkciji W in S realizirajte z uporabo semaforjev, pri čemer je id identifikator semaforja, ki ga uporabljamo. V skupnem pomnilniku imejte naslednjo strukturo (vaš kritični odsek) (uporabite funkcije za delo s skupnim pomnikom):
Komentarji
http://en.wikipedia.org/wiki/Semaphore_(programming)
S semaforji ščitiš neko podatkovno strukturo. Najlažje je, da narediš mutex. Ta mutex bo vklopljen vedno, kadar bo neka funkcija posegala po skupnem resourcu. In če bodo druge funkcije med tem časom tudi želele posegati, bodo morale počakati, da trenutna funkcija zaklenjen resource odklene.
#include
#include
#include
#include
#include
#include
struct sembuf sops;
int semid;
int shmid;
void W(int id)
{
sops.sem_num=0;
sops.sem_op=-1;
sops.sem_flg=0;
semop(semid, &sops, 1); /*tukaj vstopimo v kritično odsek*/
}
void S(int id)
{
sops.sem_num=0;
sops.sem_op=1;
sops.sem_flg=0;
semop(semid, &sops, 1); /*izstopimo iz kritičnega odseka*/
}
struct skupna_struktura
{
int vrhVmesnika;
int vmesnik[3];
int koncano;
};
void ustvari_pomn()
{
int shmid;
shmid = shmget(1234,1*sizeof(struct skupna_struktura),IPC_CREAT | 0600);
}
void ustvari_sem()
{
semid = semget(4321,1,IPC_EXCL|IPC_CREAT|0600);
semctl(semid, 0, SETVAL,1); /*semaforju priredimo vrednost 1*/
}