[so] variabile conditie pe windows
George Ciobanu
so@atlantis.cs.pub.ro
Mon, 24 Nov 2003 23:01:16 -0800 (PST)
--0-810786181-1069743676=:98646
Content-Type: text/plain; charset=us-ascii
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 care tb luat inainte de orice operatie.
Voi folosi doua semafoare si un contor ce vor fi tinute intr-o structura sau intr-o clasa
in implementarea voastra :
//------------------------------------
sem zonaCritica = 1;
sem conditie = 0;
int contor = 0;
//------------------------------------
void signal() {
WaitForSingleObject(zonaCritica);
if (contor) { // trezesc pe cineva
contor--;
ReleaseSemaphore(conditie, 1);
} else { // pierde semnalul
ReleaseSemaphore(zonaCritica, 1);
}
}
//------------------------------------
void wait() {
WaitForSingleObject(zonaCritica);
contor++;
SignalObjectAndWait(zonaCritica, conditie);
}
//------------------------------------
void broadcast() {
WaitForSingleObject(zonaCritica);
if (contor) { // era cineva blocat
ReleaseSemaphore(zonaCritica, contor);
contor = 0;
ReleaseSemaphore(zonaCritica, 1);
} else { // se pierde broadcast-ul
ReleaseSemaphore(zonaCritica, 1);
}
}
//------------------------------------
Observatie : ce vedeti mai sus este pseudocod ;)
George
---------------------------------
Do you Yahoo!?
Free Pop-Up Blocker - Get it now
--0-810786181-1069743676=:98646
Content-Type: text/html; charset=us-ascii
<P>Pentru cei care vor sa foloseasca variabilele conditie si pe windows le propun implementarea de mai jos.<BR>Se observa ca nu mai exista mutexul suplimentar care tb luat inainte de orice operatie.<BR>Voi folosi doua semafoare si un contor ce vor fi tinute intr-o structura sau intr-o clasa<BR>in implementarea voastra :</P>
<P><BR>//------------------------------------<BR>sem zonaCritica = 1;<BR>sem conditie = 0;<BR>int contor = 0;<BR>//------------------------------------</P>
<P>void signal() {<BR> WaitForSingleObject(zonaCritica);<BR> if (contor) { // trezesc pe cineva<BR> contor--;<BR> ReleaseSemaphore(conditie, 1); <BR> <BR> } else { // pierde semnalul <BR> ReleaseSemaphore(zonaCritica, 1);<BR> }<BR>}<BR>//------------------------------------<BR>void wait() {<BR> WaitForSingleObject(zonaCritica);<BR> contor++;<BR> SignalObjectAndWait(zonaCritica, conditie);<BR>}<BR>//------------------------------------<BR>void broadcast() {<BR> WaitForSingleObject(zonaCritica);<BR> if (contor) { // era cineva blocat<BR> ReleaseSemaphore(zonaCritica, contor);<BR> contor = 0;<BR> ReleaseSemaphore(zonaCritica, 1);<BR> } else { // se pierde broadcast-ul<BR> ReleaseSemaphore(zonaCritica, 1);<BR> }<BR>}<BR>//------------------------------------</P>
<P>Observatie : ce vedeti mai sus este pseudocod ;)<BR>George</P><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-810786181-1069743676=:98646--