# Lista 12
###### tags: `SO`
## Zadanie 1
myid - niewspółdzielone
strtab - współdzielony
vargp - niewspółdzielony
cnt - współdzielony <- źródło wyścigów
argc - niewspółdzielony
argv[0] - współdzielony
## Zadanie 2
Sekcja krytyczna - fragment kodu wykonywany jednocześnie tylko przez jeden wątek.
- wzajemne wykluczenie
Czemu nie możemy używać wyłączania przerwań?
Możemy pominąć niektóre przerwania.
## Zadanie 3


```c=
void unlock(lock_t *lock) {
lock->flag = 0;
}
```
(1 + n) /2 * n
## Zadanie 4
`yield` może być droższy od aktywnego czekania.

setpark - informueje o zamiarze parka
Bez setparka, ktos inny moze nas obudzic zanim zasniemy
## Zadanie 5

Nie radzi sobie z zamkami, które nie spełniają jego początkowych założeń (może zwrócić wynik fałszywie pozytywny).

## Zadanie 6
turn B
blocked A:true B:false
blocked A:true B:true
turn A
## Zadanie 7
Załóżmy, że wątek A jako pierwszy ustawił zmienną `turn`, a B jako drugi. Wiemy wtedy, że gdy B odczytywał warunek pętli `while`, to flaga wątku A była ustawiona (ponieważ musiał zrobić to przed ustawieniem zmiennej `turn`, a więc przed naszym odczytem) oraz zmienna `turn` wskazywała również na wątek A, zatem wątek B był zmuszony czekać w pętli.
## Zadanie 8
count: 1
V()
## Zadanie 9
a)
**push**:
n = 2
push()
pop()
if not full
push()
if full
sleep
wakeup
push() <-
**pop:**
push()
if not empty
pop()
if empty:
sleep
wakeup
pop()
b)
n * push()
wakeup cons
if queue.full:
n * pop()
if empty
sleep
sleep