Základní práce se semafory

Užitečné odkazy

Objekt Semaphore

Semaphore je třída reprezentující synchronizační primitivum semafor. Semafor je při vytvoření nastaven na určitou hodnotu. Z teorie známe dvě funkce P() a V(), které tuto hodnotu mění, v Python3 jsou tyto funkce pojmenovány acquire() a release().

Úkol
Pomoci semaforu můžeme elegantně implementovat takzvaný mutex a vyřešít tím problém z předchozí hodiny. Upravte tedy sdílený čítač tak, aby byla hodnota vždy správná.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import threading

def increment():
    global counter

    for i in range(100000):
        counter += 1

## Globální counter        
counter = 0    

thread1 = threading.Thread(target=increment)
thread2 = threading.Thread(target=increment)

## Spustíme thread
thread1.start()
thread2.start()

## Počkáme na to až thread doběhne
thread1.join()
thread2.join()

print(counter)

Úkol
Následující kód doplňte o synchronizaci, tak aby byl print() prováděn ve správném pořadí. Synchronizace by neměla být příliš silná, například nás nezajímá v jakém pořadí bude vypsáno Print before B a Print before A.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import threading
import time
import random

def thread_a_function():
    # Náhodné čekání, simuluje pomalejší/rychlejší vlákno
    time.sleep(random.uniform(0, 1))
    # Obsah vlákna
    print("Print before B")
    print("A")

def thread_b_function():
    # Náhodné čekání, simuluje pomalejší/rychlejší vlákno
    time.sleep(random.uniform(0, 1))
    # Obsah vlákna
    print("Print before A")
    print("B")


thread_a = threading.Thread(target=thread_a_function)
thread_b = threading.Thread(target=thread_b_function)

thread_a.start()
thread_b.start()