Prove scritte 2005
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())