@Phibrizzo,
post #1
Zakładam, że to są taski jednego programu. Wtedy robisz to tak. Strukturę semafora najprościej zadeklarować jako globalną, wtedy oba taski będą miały dostęp.
struct SignalSemaphore MojSemafor;
Przed użyciem task „główny” musi zainicjować semafor:
InitSemaphore(&MojSemafor);
Teraz Twój kod będzie wyglądał tak (w obu taskach):
...
ObtainSemaphore(&MojSemafor);
Funkcja();
ReleaseSemaphore(&MojSemafor);
...
Działa to w ten sposób, że jeżeli jeden z tasków wykona ObtainSemaphore(), to gdy drugi też wywoła tę funkcję, to będzie w niej czekał, aż pierwszy wykona ReleaseSemaphore(). Czekanie odbywa się tak samo jak w funkcji Wait(), bo semafory są wewnętrznie zaimplementowane za pomocą sygnałów.
Możesz to sobie nawet uprościć umieszczając te wywołania wewnątrz swojej funkcji, odpada Ci wtedy pamiętanie o tym, żeby każde jej wywołanie „obstawić” semaforem:
void Funkcja(...)
{
ObtainSemaphore(&MojSemafor);
/* robię różne rzeczy, inne moje taski czekają */
ReleaseSemaphore(&MojSemafor);
}