Prove scritte 2005

From Sistemi Operativi
Jump to navigation Jump to search

Esame di Concorrenza del 13/01/2005

Il testo degli esercizi è disponibile alla pagina http://www.cs.unibo.it/~renzo/so/compiti/2005-01-13.con.pdf.

Esercizio 1 (da controllare)

Il codice di questo esercizio può essere eseguito scaricando il sorgente Python e l'archivio relativo agli strumenti di concorrenza per il linguaggio Python.


#!/usr/bin/env python3
import threading
import random
import time
from pysm.semaphore import semaphore


class mod_counter:
    def __init__(self, mod, start=0):
        self._mod = mod
        self._val = start

    def inc(self):
        self._val = (self._val + 1) % self._mod

    def get(self):
        return self._val


class process(threading.Thread):
    def __init__(self, to_print, c: mod_counter, a, t, r):
        threading.Thread.__init__(self, name="proc" + to_print)

        if to_print not in "tar":
            raise ValueError("Unexpected printable character:", to_print)

        self._counter = c
        self._x = to_print
        self._semaphores = {'t': t, 'a': a, 'r': r}
        self._enter = True

        if self._x == 't':
            self._semaphores[self._x].V()

    def run(self):
        while True:
            self.sync()
            print("[%s] %c" % (self.name, self._x))

            # Print a trailing newline
            if (self._counter.get() == 7):
                print()

            time.sleep(random.random() * 0.5)

    def sync(self):
        if (self._enter):
            self._semaphores[self._x].P()
            self._enter = False
        else:
            self._counter.inc()
            curr = "taratata"[self._counter.get()]

            self._semaphores[curr].V()

            self._enter = True
            self.sync()


def main():
    counter = mod_counter(8)
    semaphores = (semaphore(0), semaphore(0), semaphore(0))
    procs = [process(c, counter, *semaphores) for c in "tar"]

    for p in procs:
        p.daemon = True
        p.start()

    for p in procs:
        p.join()

    return 0


if __name__ == "__main__":
    exit(main())