[ Predrag Damnjanovic @ 04.05.2003. 14:53 ] @
Postoje li Win32API funkcije slicne pthread_cond_wait() i pthread_cond_signal() ?
Stopiranje i ponovno pustanje thread-a bez ovih funkcija je veoma riskantno.

Napravio sam neku vrstu simulacije te funkcije, ali...
Code:

cs.leave();    // ovde moze da uleti unlock() (koji je do tada cekao) i otkljuca thread pre nego sto on bude zakljucan.
SuspendThread (pid);
cs.enter();


Postoji resenje da napravim jedan Sleep(100) kod unlock() funkcije, pa da tako budem siguran da je thread sigurno zakljucan, ali verujem da postoji i neko bolje resenje?

Video sam neke Semaphore funkcije, da nije to?
[ leka @ 04.05.2003. 19:54 ] @
http://www.cs.wustl.edu/~schmidt/win32-cv-1.html
[ Predrag Damnjanovic @ 04.05.2003. 20:49 ] @
hvala, proucicu ovo

p.s. jos ne verujem svojim ocima ko mi je odgovorio :)
pozdrav leko... onaj SIM 0.8 gadno zeza, ne mogu uopste poruke da ti saljem...
[ Predrag Damnjanovic @ 05.05.2003. 00:33 ] @
Pogledao sam clanak.
Resenje 3.1 je pogresno (kao sto i pise), ali je i 3.2 pogresno (iako to ne pise, ili ja nisam zapazio), lepo moze unlock() da otkljuca thread pre nego sto se on zaista zakljuca, bas kao u 3.1.
3.2 ima samo proveru da li je thread otkljucan, uopste ne moze da vidi da li je thread zaista zakljucan, nema mehanizam da spreci race-condition.

Resenje 3.3 je OK, mada su ga ukomplikovali preterano.
Takvo resenje je meni palo na pamet, pre nego sto sam ga video u ovom clanku, samo mnogo mnogo jednostavnije, bez duplog mutex-a.
To resenje nije nista 'novo' sto nisam znao, funkcija za otkljucavanje se ne zavrsava sve dok se thread zaista ne oTkljuca, i to moze da se realizuje uz pomoc samo jedne promeljive, ovako:

Code:

int pthread_cond_signal (...)
{
  [..] // proverava da li je thread zakljucan
  unlocked=0;
  while (unlocked==0)
    ResumeThread (pid);
}

int pthread_cond_wait (...)
{
  [..] // proglasava thread zakljucanim
  cs.leave();
  SuspendThread (pid);
  unlocked=1;
  cs.enter();
  [..] // proglasava thread otkljucanim
}


To je u osnovi to resenje, samo sto su oni ubacili dodatni mutex, pa imaju neki counter... i naravno koriste Event-e, sto ja ne koristim.
U principu, mozda je njihov sors OK ako nekome treba counter i ako neko koristi Event-e, ali meni counter ne treba, i ne koristim Event-e.


E sada, resenje 3.4 je zanimljivo.
U mom Win32API Reference help-u, koji sam uzeo od Delphi-ja 5, pise da SignalObjectAndWait() moze da se koristi za Mutex-e (izmedju ostalog), a o CriticalSections nema ni govora.
U resenju 3.4, funkciju SignalObjectAndWait() koriste bas u kombinaciji sa CS-om !!!
U cemu je fazon?

Nisam probao da li resenje 3.4 zaista radi, pa me interesuje da li su ovi, koji su pisali clanak, proverili to resenje na delu?
Ili je u pitanju prica da MS slucajno ili namerno nije ubacio CS u listi tipova koje ova funkcija prima?
Jos jedna nedokumentovana stvar?
[ 6544616a006e @ 05.05.2003. 01:34 ] @
Predraže ti si neki veoma čudan čovek... Pre dva-tri dana pitaš da li (int)1.9 uvek daje 1, a sada duboko zalaziš u Win32 thread model...
[ Gojko Vujovic @ 05.05.2003. 01:43 ] @
Zar ti to ne govori samo koliko dečko brzo napreduje? :)
[ jc denton @ 05.05.2003. 02:20 ] @
Vidi ga leka - bice ovo vruce leto na ES-u izgleda :)
Salim se, welcome back.
[ leka @ 05.05.2003. 09:35 ] @
ftp://sources.redhat.com/pub/p...2002-11-04/pthread_cond_wait.c
[ Predrag Damnjanovic @ 05.05.2003. 14:27 ] @
ja u c++ programiram od 2002., a u C od 2000., nisam uopste pocetnik.
A za (int) pitam jer nigde nisam zapazio pravilo pri zaokruzivanju broja, a trebalo mi zaokruzivanje iskljucivo na dole, a <math.h> funkcije ne bih koristio samo zbog toga, da bezveze linkujem libm....

Hvala leko.