[so] variabile conditie pe windows
George Ciobanu
so@atlantis.cs.pub.ro
Mon, 24 Nov 2003 23:48:45 -0800 (PST)
--0-183392963-1069746525=:73628
Content-Type: multipart/alternative; boundary="0-1634801847-1069746525=:73628"
--0-1634801847-1069746525=:73628
Content-Type: text/plain; charset=us-ascii
Salut,
Implementarea data este gresita (cam mult copy/paste).Pentru o implementare corecta (zic eu) a se vedea fisierul atasat.
George
---------------------------------
Do you Yahoo!?
Free Pop-Up Blocker - Get it now
--0-1634801847-1069746525=:73628
Content-Type: text/html; charset=us-ascii
<DIV>
<DIV>
<DIV>
<DIV>
<DIV>
<DIV>Salut,</DIV>
<DIV> </DIV>
<DIV>Implementarea data este gresita (cam mult copy/paste).Pentru o implementare corecta (zic eu) a se vedea fisierul atasat.</DIV>
<DIV> </DIV>
<DIV>George<BR><BR></DIV></DIV></DIV></DIV></DIV></DIV><p><hr SIZE=1>
Do you Yahoo!?<br>
<a href="http://us.rd.yahoo.com/slv/mailtag/*http://companion.yahoo.com/">Free Pop-Up Blocker - Get it now</a>
--0-1634801847-1069746525=:73628--
--0-183392963-1069746525=:73628
Content-Type: text/plain; name="var_cond.txt"
Content-Description: var_cond.txt
Content-Disposition: inline; filename="var_cond.txt"
Pentru cei care vor sa foloseasca variabilele conditie si pe windows le propun implementarea de mai jos.
Se observa ca nu mai exista mutexul suplimentar.
Voi folosi 4 semafoare si 2 contoare ce vor fi tinute intr-o structura sau intr-o clasa
in implementarea voastra :
//------------------------------------
sem zonaCritica = 1;
sem conditie = 0;
sem asteaptaTrezire := 0;
sem blocheazaAlti :=1
volatile int asteapta = 0;
volatile int contor = 0;
//------------------------------------
void signal() {
WaitForSingleObject(blocheazaAlti);
WaitForSingleObject(zonaCritica);
if (contor) { // trezesc pe cineva
contor--;
asteapta++;
ReleaseSemaphore(conditie, 1);
ReleaseSemaphore(zonaCritica, 1);
P(asteaptaTrezire);
ReleaseSemaphore(blocheazaAlti, 1);
} else { // pierde semnalul
ReleaseSemaphore(zonaCritica, 1);
ReleaseSemaphore(blocheazaAlti, 1);
}
}
//------------------------------------
void wait() {
WaitForSingleObject(blocheazaAlti);
WaitForSingleObject(zonaCritica);
contor++;
ReleaseSemaphore(blocheazaAlti, 1);
SignalObjectAndWait(zonaCritica, conditie);
WaitForSingleObject(zonaCritica);
asteapta--;
if (asteapta == 0)
V(asteaptaTrezire);
ReleaseSemaphore(zonaCritica, 1);
}
//------------------------------------
void broadcast() {
WaitForSingleObject(blocheazaAlti);
WaitForSingleObject(zonaCritica);
if (contor) { // era cineva blocat
ReleaseSemaphore(conditie, contor);
asteapta = contor;
contor = 0;
ReleaseSemaphore(zonaCritica, 1);
P(asteaptaTrezire);
ReleaseSemaphore(blocheazaAlti, 1);
} else { // se pierde broadcast-ul
ReleaseSemaphore(zonaCritica, 1);
ReleaseSemaphore(blocheazaAlti, 1);
}
}
//------------------------------------
--0-183392963-1069746525=:73628--