[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>&nbsp;</DIV>
<DIV>Implementarea data este gresita (cam mult copy/paste).Pentru o implementare corecta (zic eu) a se vedea fisierul atasat.</DIV>
<DIV>&nbsp;</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--