kategoria: ANSI C
[#1] [C] Semafory
Witam mam taki kawalek kodu

int main(void)
{
......
Funkcja();
......
}

void DrugiTask(void)
{
.....
Funkcja();
....
}


Jak najlepiej zabezpieczyc sie przed tym aby jesli main() wywola funkcje to w trakcie jej wywolywania DrugiTask() nie mial do niej dostepu?
Po lamersku rozwiazalby to tak:
Funkcja()
{
while(status == TRUE) Delay(1);
status = TRUE;
......
status = FALSE;
}


Ale nie wiem czy to bezpiecżne a poza tym smierdzi mi to Linuksem
Wiem ze Amiga wspiera cos takiego jak semafory. Odnalazlem w NDK cos takiego jak:
InitSemaphore(), ObtainSemaphore() i ReleaseSemaphore()
ale nie wiem jak tego uzyc. Czy ktos moglby cos podpowiedziec jak w to ubrac powyzszy kod?
[#2] Re: [C] Semafory

@Phibrizzo, post #1

Semaphore sema;

int main(void)
{
InitSemaphore(&sema);

...
}

Funkcja()
{
ObtainSemaphore(&sema);
while(status == TRUE) Delay(1);
status = TRUE;
......
status = FALSE;

ReleaseSemaphore(&sema);
}

Drugi task wywola funkcje ale ObtainSemaphore bedzie czekac na ReleaseSemaphore z glownego tasku (o ile ten jest właśnie 'pomiędzy' Obtain i Release). To samo jeżeli z main() będziesz chciał wywołać funkcje a drugi task będzie ją aktualnie wykonywał. Zobacz sobie jeszcze AttemptSemaphore() jezeli nie chcesz żeby kod czekał na zwolnienie semafora.
[#3] Re: [C] Semafory

@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);
}
[#4] Re: [C] Semafory

@Krashan, post #3

Dzieki, z tego co widze dziala jak trzeba szeroki uśmiech
Na stronie www.PPA.pl, podobnie jak na wielu innych stronach internetowych, wykorzystywane są tzw. cookies (ciasteczka). Służą ona m.in. do tego, aby zalogować się na swoje konto, czy brać udział w ankietach. Ze względu na nowe regulacje prawne jesteśmy zobowiązani do poinformowania Cię o tym w wyraźniejszy niż dotychczas sposób. Dalsze korzystanie z naszej strony bez zmiany ustawień przeglądarki internetowej będzie oznaczać, że zgadzasz się na ich wykorzystywanie.
OK, rozumiem