[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>&nbsp;WaitForSingleObject(zonaCritica);<BR>&nbsp;if (contor) { // trezesc pe cineva<BR>&nbsp;&nbsp;contor--;<BR>&nbsp;&nbsp;ReleaseSemaphore(conditie, 1); <BR>&nbsp;&nbsp;<BR>&nbsp;} else { // pierde semnalul <BR>&nbsp;&nbsp;ReleaseSemaphore(zonaCritica, 1);<BR>&nbsp;}<BR>}<BR>//------------------------------------<BR>void wait() {<BR>&nbsp;WaitForSingleObject(zonaCritica);<BR>&nbsp;contor++;<BR>&nbsp;SignalObjectAndWait(zonaCritica, conditie);<BR>}<BR>//------------------------------------<BR>void broadcast() {<BR>&nbsp;WaitForSingleObject(zonaCritica);<BR>&nbsp;if (contor) { // era cineva blocat<BR>&nbsp;&nbsp;ReleaseSemaphore(zonaCritica, contor);<BR>&nbsp;&nbsp;contor = 0;<BR>&nbsp;&nbsp;ReleaseSemaphore(zonaCritica, 1);<BR>&nbsp;} else { // se pierde broadcast-ul<BR>&nbsp;&nbsp;ReleaseSemaphore(zonaCritica, 1);<BR>&nbsp;}<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--