Difference between revisions of "Prove scritte 2020"
Jump to navigation
Jump to search
(6 intermediate revisions by 2 users not shown) | |||
Line 3: | Line 3: | ||
== esercizio c1 == | == esercizio c1 == | ||
− | === Soluzione proposta 1 === | + | === Soluzione proposta 1 === |
+ | <syntaxhighlight lang="C"> | ||
+ | class TS{ | ||
+ | |||
+ | int v=0; | ||
+ | queue<(unsigned int,cond)> pq; | ||
+ | usinged int timer; | ||
+ | |||
+ | |||
+ | void V(){ | ||
+ | if(pq.empty()){ | ||
+ | v++; | ||
+ | }else{ | ||
+ | pq.pop().signal(); | ||
+ | } | ||
+ | } | ||
+ | bool P(unsigned int timeout){ | ||
+ | if(v == 0){ | ||
+ | cond c = new condition(); | ||
+ | pq.push((timeout+timer,)); | ||
+ | c.wait(); | ||
+ | free(c); | ||
+ | if timer== timeout+timer{ | ||
+ | return true; | ||
+ | } | ||
+ | }else{ | ||
+ | v--; | ||
+ | } | ||
+ | return false; | ||
+ | } | ||
+ | |||
+ | void tick(){ | ||
+ | timer++; | ||
+ | for [i,c] in pq.iter(){ | ||
+ | if( i <= timer) { | ||
+ | c.signal(); | ||
+ | // la nostra stuttura dati supporta la rimozione durante lo scorrimento | ||
+ | // per esempio può essere una lista | ||
+ | pq.remove(c); | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | </syntaxhighlight> | ||
+ | |||
+ | |||
+ | === Soluzione proposta 2 === | ||
+ | |||
+ | <syntaxhighlight lang="C"> | ||
+ | |||
+ | int value; | ||
+ | boolean ret_val; | ||
+ | int time; | ||
+ | min_heap<int, condition> heap; // ordinato sul tempo minore. | ||
+ | vector<condition> queue; // vector utilizzato come queue, con rimozione anche nel mezzo. | ||
+ | |||
+ | |||
+ | monitor { | ||
+ | value = 0; | ||
+ | time = 0; | ||
+ | } | ||
+ | |||
+ | void V(void) { | ||
+ | if (heap.size() > 0) { | ||
+ | condition c = queue.pop_back(); // remove and return | ||
+ | heap.remove(c); // rimuovi l'unico elemento con c. | ||
+ | ret_val = true; | ||
+ | c.signal(); | ||
+ | } else { | ||
+ | value++; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | |||
+ | boolean P(unsigned int timeout) { | ||
+ | if (value > 0) { | ||
+ | value--; | ||
+ | return true; | ||
+ | } else { | ||
+ | int next_time = timeout + time; | ||
+ | condition c = new condition(); | ||
+ | heap.insert(<next_time, c>); | ||
+ | queue.push_back(c); | ||
+ | c.wait(); | ||
+ | free(c); | ||
+ | |||
+ | return ret_val; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | |||
+ | void tick(void) { | ||
+ | ret_val = false; | ||
+ | time++; | ||
+ | while (heap.size() > 0 && heap.top().0 <= time) { | ||
+ | condition c = heap.top().1; | ||
+ | heap.deleteTop(); | ||
+ | queue.remove(c); | ||
+ | c.signal(); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | </syntaxhighlight> | ||
+ | |||
+ | == esercizio c2 == | ||
+ | |||
+ | |||
+ | === Soluzione proposta 1 === | ||
+ | |||
+ | [[User:Gio|Gio]] ([[User talk:Gio|talk]]) 14:43, 16 January 2023 (CET) | ||
+ | * Modificato [[User:Flecart|Flecart]] ([[User talk:Flecart|talk]]) 15:36, 16 January 2023 (CET) | ||
+ | |||
+ | <syntaxhighlight lang="C"> | ||
+ | |||
+ | void multisend(pid_t destination,T msg,int times){ | ||
+ | for(int i=0; i<n; i++) { | ||
+ | asend(<n-i, getpid(), msg>, destination); | ||
+ | ack = arecv(destination); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | T multirecv(pid_t sender_first) { | ||
+ | <i, sender, msg> = arecv(sender_first); | ||
+ | asend(ack, sender); | ||
+ | |||
+ | while(i > 0) { | ||
+ | <j, _, msg>=arecv(sender); | ||
+ | asend(ack, sender); | ||
+ | i--; | ||
+ | assert(i==j); | ||
+ | } | ||
+ | return msg; | ||
+ | } | ||
+ | |||
+ | </syntaxhighlight> | ||
+ | |||
+ | = Prova 2020/02/20 = | ||
+ | |||
== esercizio c2 == | == esercizio c2 == | ||
+ | |||
+ | Sol : x alla seconda |
Latest revision as of 15:36, 16 January 2023
Prova 2020/01/15
esercizio c1
Soluzione proposta 1
class TS{
int v=0;
queue<(unsigned int,cond)> pq;
usinged int timer;
void V(){
if(pq.empty()){
v++;
}else{
pq.pop().signal();
}
}
bool P(unsigned int timeout){
if(v == 0){
cond c = new condition();
pq.push((timeout+timer,));
c.wait();
free(c);
if timer== timeout+timer{
return true;
}
}else{
v--;
}
return false;
}
void tick(){
timer++;
for [i,c] in pq.iter(){
if( i <= timer) {
c.signal();
// la nostra stuttura dati supporta la rimozione durante lo scorrimento
// per esempio può essere una lista
pq.remove(c);
}
}
}
}
Soluzione proposta 2
int value;
boolean ret_val;
int time;
min_heap<int, condition> heap; // ordinato sul tempo minore.
vector<condition> queue; // vector utilizzato come queue, con rimozione anche nel mezzo.
monitor {
value = 0;
time = 0;
}
void V(void) {
if (heap.size() > 0) {
condition c = queue.pop_back(); // remove and return
heap.remove(c); // rimuovi l'unico elemento con c.
ret_val = true;
c.signal();
} else {
value++;
}
}
boolean P(unsigned int timeout) {
if (value > 0) {
value--;
return true;
} else {
int next_time = timeout + time;
condition c = new condition();
heap.insert(<next_time, c>);
queue.push_back(c);
c.wait();
free(c);
return ret_val;
}
}
void tick(void) {
ret_val = false;
time++;
while (heap.size() > 0 && heap.top().0 <= time) {
condition c = heap.top().1;
heap.deleteTop();
queue.remove(c);
c.signal();
}
}
esercizio c2
Soluzione proposta 1
Gio (talk) 14:43, 16 January 2023 (CET)
void multisend(pid_t destination,T msg,int times){
for(int i=0; i<n; i++) {
asend(<n-i, getpid(), msg>, destination);
ack = arecv(destination);
}
}
T multirecv(pid_t sender_first) {
<i, sender, msg> = arecv(sender_first);
asend(ack, sender);
while(i > 0) {
<j, _, msg>=arecv(sender);
asend(ack, sender);
i--;
assert(i==j);
}
return msg;
}
Prova 2020/02/20
esercizio c2
Sol : x alla seconda