2. cvičení


Vlákna v programovacích jazycích

LISP

Pro potřeby tohoto předmětu budeme používat knihovnu od Dr. Osičky, která je ke stažení zde. V souboru load.lisp je nutné změnit cesty. Pak stačí pomocí LispWorks načíst soubor pomocí (Compile and Load...) load.lisp.

Instalace QuickLisp

  1. Quicklisp lze stáhnout na stránce https://www.quicklisp.org/beta/.
  2. Stažený soubor quicklisp.lisp načíst pomoci File > Compile and Load.
  3. Spustit instalaci pomocí (quicklisp-quickstart:install).

Instalace QuickLisp vytvoří složku quicklisp v domovském adresáři (Linux, macOS) nebo ve složce Users\jmeno (Windows).

Použití

    
        ;; aprogn (asynchronni progn)
        ;; syntax: (a-progn
        ;;             forma1
        ;;             forma2
        ;;             ...)
        ;; semantika: asynchronne vola vyhodnoceni forem, kazdou v jednom vlaknu
        ;;            vraci seznam zavolanych vlaken, ve vlaknech je navazana
        ;;            promenna pro standardni vystup

        (a-progn
          (+ 1 2)
          (* 2 2)
          (/ 2 2))

        ;; asynchroni dolist
        ;; syntax:  (a-dolist (var list)
        ;;            body)
        ;; semantika: postupne vaze prvky list na promenou var, pro kazde navazani
        ;;            spusti body ve vlastnim vlakne, ve vlaknech je navazana promenna
        ;;            pro standardni vystup
        ;; navratova hodnota: seznam spustenych vlaken, vlakna jsou pojmenovana podle hodnot var

        (a-dolist (i '(1 2 3 4))
          (print i))
    

Úkoly

  1. Napište program, kde budou alespoň 2 vlákna n-krát inkrementovat čítač. Za n zvolte dostatečně velké číslo.

  2. Napište program, kde budou 2 vlákna každé z nich se uspí na náhodnou dobu a pak vypíše text na obrazovku.

  3. Naprogramujte nasledující algoritmus. Před implementací zkuste přijít na to co daný algoritmus dělá.

    Algorithm A
  4. Naprogramujte Welfare crook problem:

    Welfare crook problem
  5. Naprogramujte paralelní násobení matic.


Zdroje

[1] M. BEN-ARI, Principles of Concurrent And Distributed Programming, second edidion, 2006