C1
//versione fatta con assunzione che ci sia una sola skill
int ww; //lavoratori in attesa
int wo; //owner in attesa
COndition ok2w
COndition ok2o
string N
cercolavoro(nome, ....)
  if (wo > 0)
    N = nome
    ok2o.signal()
  else:
    ww++
    ok2w.wait()
    N = nome
    ww--
               
assumo(...)
  if (ww > 0)
    ok2w.signal()
  else
    wo++
    ok2o.wait()
    wo--
  return N

//----------------------------------------

//soluzione del prof completa

struct type {
	char * skill;
	int ww = 0; //lavoratori in attesa
	int wo = 0; //owner in attesa
	COndition ok2w
	COndition ok2o
}

char * N
cercolavoro(nome, sk)
	struct type t = getorcreate skill(sk)
	if (t->wo > 0)
		N = nome
		t->ok2o.signal()
	else:
	   t->ww++
		t->ok2w.wait()
		t->ww--
      N = nome
               
	assumo(sk)
		struct type t = getorcreate skill(sk)
		if (t->ww > 0):
			t->ok2w.signal()
		else:
			t->wo++
			t->ok2o.wait()
			t->wo--
     	return N

=================================================================
C2
//fatto dal prof il 26/08/22
server[N] = ... pids
serversender[N] = [None,...,None]

process dispatcher:
	while True:
		<sender, msg> = arecv(ANY)
		if sender in server:
			i = indexof(sender, server)
			asend(msg, serversender[i])
			if !q.empty():
				(client, msg) = q.dequeue()
				asend(msg, server[i])
				serversender[i] = client
			else:
				serversender[i] = None
		else:
			i = idleserver(serversender) #indice del primo None o restituisce None
			if i = None:
				q.add((ender,msg))
			else:
				asend(msg, server[i])
				serversender[i] = sender