Z definicji, współbieżne systemy czasu rzeczywistego używają zadań , aby osiągnąć własności asynchroniczne. Jednak czasami istnieje **konieczność synchronizacji zadań poprzez blokowanie ich do czasu, aż potrzebny im zasób będzie dostępny.** Synchronizacja zarządza dostępem do wspólnych zasobów przez wstrzymanie zadania poprzez wejście w obszar krytyczny na czas, gdy inne zadanie używa danych. Każda dzielona zmienna lub globalna wspólna pamięć musi posiadać mechanizm wzajemnego wykluczania w celu zapobieżenia niepoprawnemu przetwarzaniu danych. Takim mechanizmem są semafory.

**Semafor** (semaphore) S jest zmienną systemową, której wartość może być sprawdzana i zmieniana przez wszystkie zadania za pomocą jednej z dwóch niepodzielnych instrukcji:

            Wait(S)  if S >0 then 
                         S = S – 1
                     else  
                         zawieś wykonywanie zadania


            Post (S) if istnieje zadanie zawieszone then 
                         wznów jedno zdanie
                     else  
                         S = S + 1

Lista zadań zawieszonych na semaforze może być obsługiwana zgodnie z algorytmem FIFO lub też mogą być brane pod uwagę priorytety zdań. Zaletą pierwszego sposobu jest prostota i uczciwość tzn, żadne zdanie zawieszone nie będzie czekać w nieskończoność na zasób. Wadą jest możliwość wstrzymywania zadania o wyższych priorytetach przez wcześniej zawieszone zadania o niższych priorytetach. Cechy algorytmu priorytetowego są przeciwstawne. W praktyce najczęściej stosowany jest algorytm FIFO.
**
Niepodzielność operacji wait oraz post oznacza niemożliwość jednoczesnego wykonywania dwóch dowolnych operacji na tym samym semaforze przez wiecej niż jeno zadanie.**

**Anomaliami synchronizacji są:**

  * **Zakleszczenie** – katastrofalna sytuacja, która może nastąpić, gdy zadania oczekują na wznowienie przez inne zadania, które z kolei są zwieszone w oczekiwaniu na wznowienie przez zadania pierwszej grupy.

  * **Inwersja priorytetów** – problem występuje, gdy zadnie o wysokim priorytecie i zadnie o niskim priorytecie współdzielą jakiś zasób. Zadanie o niskim priorytecie pobiera krytyczny zasób. Zadanie o średnim priorytecie wywłaszcza zadanie o niskim priorytecie (nie konkuruje o zasób, czyli nie jest ograniczony semaforem). Zadanie o wysokim priorytecie nie może się wykonać, bo czeka na zwolnienie zasobu, będącego w posiadaniu zadania o niskim priorytecie, a zadanie to nie może się wykonać, ponieważ zostało wywłaszczone przez zadanie o wyższym priorytecie.
 

