[so] Wait for zero
Razvan Deaconescu
razvand at cs.pub.ro
Wed Apr 9 00:02:02 EEST 2008
On Tue, 2008-04-08 at 13:21 -0700, Alexandru Marinescu wrote:
> In linux in momentul in care se face
> struct sembuf op = {0, 0, 0};
> semop(sem, &op, 1);
>
> Un proces va astepta ca primul semafor din multimea de semafoare
> descrise de sem sa ajunga la valoarea 0.
>
> Cum pot face in Windows o blocare a unui proces pe un semafor pana
> cand acesta ajunge la zero?
Direct nu ai cum.
Poti folosi urmatoarea smecherie:
---
struct ZeroSemaphore {
HANDLE hSem;
HANDLE mutex;
DWORD count;
DWORD initVal;
};
struct ZeroSemaphore * CreateZeroSemaphore(key, initVal, maxVal)
{
struct ZeroSemaphore *zs = malloc(sizeof(*zs));
zs->hSem = CreateSemaphore(key, 0, maxVal);
zs->count = initVal;
zs->initVal = initVal;
zs->mutex = CreateMutex/Semaphore ...
}
BOOL WaitForZero(struct ZeroSemaphore *zs)
{
WaitForSingleObject(mutex);
count--;
if (count == 0)
ReleaseSemaphore(zs->sem, initVal, NULL);
ReleaseMutex/Semaphore(mutex);
WaitForSingleObject(zs->sem);
}
BOOL Destroy/CloseZeroSemaphore(struct ZeroSemaphore *zs)
{
...
}
---
Greselile din cod sunt vina clientului de mail, nu a autorului :-P. Dupa
cum vezi, poti folosi o constructie asemanatoarea celei de implementare
a unei bariere pentru emularea operatiei wait-for-zero (inexistenta pe
Windows). De fapt aceasta este si una din utilizarile importante ale
operatiei: implementarea facila a unei bariere.
Nota: Eu stiu ca nu exista nativ operatia wait-for-zero pe Windows. Din
ce am gugaluit nu am gasit nici o informatie in acest sens. Daca exista,
imi cer scuze. Oricum, codul de mai sus are rezultate identice cu o
operatie wait-for-zero cu dezavantajul pierderii transparentei.
Razvan
--
This message has been scanned for viruses and
dangerous content by MailScanner, and is
believed to be clean.
More information about the so
mailing list