8. cvičení - Monitory

Condition Object

    
    import threading

    lock = threading.Lock()

    condition = threading.Condition(lock)

    # Zpracování prvku
    with lock:
        # Čekáme na až bude podmínka splněna.
        while not an_item_is_available():
            condition.wait()
        get_an_available_item()

    # Vygenerování prvku
    with lock:
        # Zneplatníme podmínku
        make_an_item_available()
        # Jakmile vložíme prvek do bufferu tak tuto "událost" oznámíme
        # Jednomu procesu čekajícímu na podmínce. Pro oznámení všem procesům
        # můžeme použít metodu notify_all.
        condition.notify()
    

Úkoly

(Bodovaný) Upravte 2. úkol ze 3. cvičení tak, že k synchronizaci použijete monitory.

Upravte 1. úkol ze 4. cvičení, tak aby vlákno které provede operaci pop na prázdný zádsobník počkalo až jiné vlákno vloží nějaký prvek. Dále proces který vloží prvek na zádsobník musí upřednostit vlákno které chce získat prvek ze zásobníku před vláknem které chce vkládat. K synchronizaci použijte monitory místo semaforů.