3. cvičení - Semafory


Vytváření vláken a použití semaforů

    
        ;; Vytváření vláken pomocí makra thread. Takto spuštěné vlákno je inhed spuštěno
        ;; ale vlákno které vytvořilo nové vlákno pomocí makra nečeká na dokončení výpočtu.
        (thread
          (sleep 4)
          (apply #'* '(1 2 3 4 5 6 7 8 9)))

        ;; Pokud chceme počkat až nové vlákno dokončí výpočet použijeme k tomu metodu join-thread
        (join-thread (thread
                       (sleep 4)
                       (apply #'* '(1 2 3 4 5 6 7 8 9))))

        ;; Další možností jak vytvořit vlákno je vytvoření instance třídy thread.
        (make-instance 'thread :function (lambda ()
                                            (sleep 4)
                                            (apply #'* '(1 2 3 4 5 6 7 8 9))))

        ;; Takto vytvořené vlákno je nutné spustit pomocí metody start-thread
        (start-thread
            (make-instance 'thread :function (lambda ()
                                                (sleep 4)
                                                (apply #'* '(1 2 3 4 5 6 7 8 9)))))

        ;; Vytvoření semaforu
        (let ((sem (semaphore 1)))
            body)

        ;; Čekání a signalizace na semaforu
         (let ((sem (semaphore 1)))
              (wait-on-semaphore sem)
              ;; Critical section
              (signal-semaphore sem))

        ;; Pokud se proces nachází v kritické sekci tak v této části programu může nastat
        ;; chyba (např. zápis do neexistujícího souboru) V takovém případě vlákno neopustí
        ;; kritickou sekci a neuvolní zámek, který zajišťuje, že do kritické sekce se dostane
        ;; nejvýše jedno vlákno. Řešením je obalit kritickou sekci blokem, který vždy provede
        ;; odemknutí zámku nezávisle na tom, zda v kritické sekci nastala chyba.

        (unwind-protect
            (progn ...kriticka sekce...)
          (signal-semaphore ...))

    

Úkoly

  1. Upravte úkol 1 ze 2. cvičení tak, aby přístup ke sdílené proměnné byl synchronizován.

  2. Napište program, kde budou 3 procesy. První bude producent a bude generovat dvojice náhodných čísel. Druhý proces bude zjíšťovat jestli jsou tato dvě čísla soudělná. Pokud ano tak bude třetímu procesu poslána 1 jinak 0. Třetí proces bude počítat počet jedniček a počet všech čísel která mu pošle druhý proces.

  3. (Bodovaný) Upravte druhý úkol tak aby program skončil pokud třetí proces obdrží N jedniček.