---
# System prepended metadata

title: L4 - zarys teoretyczny (bez wyprowadzenia wzorów)

---

# L4 - zarys teoretyczny (bez wyprowadzenia wzorów)

* Algorytm piekarni

```java
class Bakery implements Lock {
    boolean[] flag;
    Label[] label;
    public Bakery (int n) {
        flag = new boolean[n];
        label = new Label[n];
        for (int i = 0; i < n; i++) {
            flag[i] = false; label[i] = 0;
        }
    }
    public void lock() {
        int i = ThreadID.get();
        flag[i] = true;
        label[i] = max(label[0], ...,label[n-1]) + 1;
        while ((∃k != i)(flag[k] && (label[k],k) << (label[i],i))) {};
    }
    public void unlock() {
        flag[ThreadID.get()] = false;
    }
}
```
![](https://i.imgur.com/lFLdHE5.png)


wzajemnie wykluczenie dla n wątków, fcfs

jest **deadlock-free**, ponieważ istnieje wątek z unikatowym najmniejszym (label[i], i), który nie czeka na żaden inny wątek
jest **fcfs**, ponieważ jeśli wątek **A** jako pierwszy wykonał **doorway-section**, to wątek **B** ma na pewno większy swój `label[i]`, flaga wątku **A** jest zapalona, więc wątek **B** nie wyprzedzi **A**
jest **starvation-free**, ponieważ jednocześnie **deadlock-free** i **FCFS** implikują **starvation-free** 


* **Filter lock**
generalizacja Petersona dla n wątków
przed wejściem do sekcji krytycznej wątek musi przejśc przez **n-1** poziomów
jeśli więcej niż jeden wątek próbuje wejść na jakiś poziom, to przynajmniej jeden wątek się tam zablokuje
ogólnie dla j pomiędzy 0 i n-1 na poziomie j jest co najwyżej n-j wątków
nie istnieje r t.ż. przejście na kolejny poziom ma własność r-ograniczonego czekania (dla 3 wątków jeden z nich może zatrzymać się na jednym poziomie, a dwa pozostałe przeskakiwać do sekcji krytycznej na zmianę)
```java=
class Filter implements Lock {
    int[] level;
    int[] victim;
    public Filter(int n) {
        level = new int[n];
        victim = new int[n]; // use 1..n-1
        for (int i = 0; i < n; i++) {
            level[i] = 0;
        }
    }
    
    public void lock() {
        int me = ThreadID.get(); // returns 0..n-1
        for (int i = 1; i < n; i++) { // attempt to enter level i
            level[me] = i;
            victim[i] = me;
            // spin while conflicts exist
            while (( ∃ k != me) (level[k] >= i && victim[i] == me)) {};
        }
    }
    
    public void unlock() {
        int me = ThreadID.get();
        level[me] = 0;
    }
}
```

* **nieformalna def. linearyzacji:**
![](https://i.imgur.com/j0fXBmE.png)
* **formalna def. linearyzacji**
![](https://i.imgur.com/CgZZTyf.png)
![](https://i.imgur.com/tTUAOrT.png)

przykład l4z6

* **Sekwencyjna spójność**
![](https://i.imgur.com/bYfQRxX.png)
 (przykład slajd 158 prw3)

* **Własność kompozycji:**

Jeżeli $H|p$ i $H|q$ są sekwencyjnie spójnie to $H$ jest sekwencyjnie spójne.

* Sekwencyjna spójność nie ma własności kompozycji (l5z2)

![](https://i.imgur.com/dahwwSQ.png)