Jakie wartości zmienna num może osiągnąć a jakich nie może przy po zakończeniu przetwarzania tych procesów: 3,4,5,6,7

int num = 5; współdzielona zmienna
Semaphore sem = 0; semafor ogólny

proces 1 | proces 2

int num1; *lokalna | int num2; *lokalna
num++; | num++;
P(sem); | V(sem);
num1 = num; | num2 = num;
num = num1 - 2; | P(sem);
V(sem); | num = num2 +1;
| V(sem);

wiem, ze każda linia jest instrukcja atomową i chciałbym przedstawić odpowiednie przeploty operacji i tutaj się narzuca moje pytanie, czy dla każdego procesu tzn się poczynając od 3 korzystamy w programu pod procesem 1 i czy wartości sem i num bierzemy z ostatniego obliczanego wątku czy stałych num = 5 i sem = 0. Przykładowo mamy po procesie 1 num =4 i sem = 5 i to przechodzi do kodu procesu drugiego czy wartości są na nowo pobierane z współdzielonych, nie do końca potrafię określić te końcowe wartości num dla danego procesu