Difference between revisions of "20220906c2"
Jump to navigation
Jump to search
(Descrizione pagina) |
(creazione headers per #links) |
||
Line 2: | Line 2: | ||
Il lettore è invitato a immedesimare il professore al momento della correzione durante la lettura delle soluzioni. | Il lettore è invitato a immedesimare il professore al momento della correzione durante la lettura delle soluzioni. | ||
+ | |||
+ | == 1 == | ||
<pre> | <pre> | ||
− | |||
− | |||
semaphore sem(1); | semaphore sem(1); | ||
int sum=0; | int sum=0; | ||
Line 22: | Line 22: | ||
return sum | return sum | ||
− | 2 | + | </pre> |
− | + | == 2 == | |
+ | <pre> | ||
queue values; | queue values; | ||
semaphore s(0); | semaphore s(0); | ||
Line 40: | Line 41: | ||
return sum | return sum | ||
− | 3 | + | </pre> |
− | + | == 3 == | |
+ | <pre> | ||
shared int sum=0; | shared int sum=0; | ||
semaphore wait(0); | semaphore wait(0); | ||
Line 60: | Line 62: | ||
return somma; | return somma; | ||
− | 4 | + | </pre> |
− | + | == 4 == | |
+ | <pre> | ||
queue<int> processlist; | queue<int> processlist; | ||
semaphore mutex(1); | semaphore mutex(1); | ||
Line 81: | Line 84: | ||
return sum; | return sum; | ||
− | 5 | + | </pre> |
− | + | == 5 == | |
+ | <pre> | ||
int counter = 0; | int counter = 0; | ||
int sum = 0; | int sum = 0; | ||
Line 105: | Line 109: | ||
return intret | return intret | ||
− | 6 | + | </pre> |
− | + | == 6 == | |
+ | <pre> | ||
int sum = 0; | int sum = 0; | ||
mutex = new semaphore(1); | mutex = new semaphore(1); | ||
Line 126: | Line 131: | ||
return value; | return value; | ||
− | 7 | + | </pre> |
− | + | == 7 == | |
+ | <pre> | ||
int nP, nV = -1, 0; | int nP, nV = -1, 0; | ||
int somma = 0 | int somma = 0 | ||
Line 153: | Line 159: | ||
return somma | return somma | ||
− | 8 | + | </pre> |
− | + | == 8 == | |
+ | <pre> | ||
struct blocked { | struct blocked { | ||
semaphore sem(0); | semaphore sem(0); | ||
Line 181: | Line 188: | ||
return count; | return count; | ||
− | 9 | + | </pre> |
− | + | == 9== | |
+ | <pre> | ||
semaphore s[] new sem(0) | semaphore s[] new sem(0) | ||
semaphore s1 new sem(0) | semaphore s1 new sem(0) | ||
Line 203: | Line 211: | ||
return tot | return tot | ||
− | 10 | + | </pre> |
− | + | == 10 == | |
+ | <pre> | ||
int nw = 0 | int nw = 0 | ||
int currsum = 0 | int currsum = 0 | ||
Line 231: | Line 240: | ||
return sum | return sum | ||
− | 11 | + | </pre> |
− | + | == 11== | |
+ | <pre> | ||
semaphore mutex(1); | semaphore mutex(1); | ||
semaphore semwait(0); | semaphore semwait(0); | ||
Line 261: | Line 271: | ||
return val; | return val; | ||
− | 12 | + | </pre> |
− | + | == 12 == | |
+ | <pre> | ||
semaphore mutex(0) | semaphore mutex(0) | ||
volatile int counter = 0 | volatile int counter = 0 | ||
Line 277: | Line 288: | ||
return counter | return counter | ||
− | 13 | + | </pre> |
− | + | == 13 == | |
+ | <pre> | ||
semaphore mutex(1) | semaphore mutex(1) | ||
int sum = 0; | int sum = 0; | ||
Line 301: | Line 313: | ||
mutex.V() | mutex.V() | ||
− | 14 | + | </pre> |
− | + | == 14 == | |
+ | <pre> | ||
semaphore mutex(1) | semaphore mutex(1) | ||
int sum = 0; | int sum = 0; | ||
Line 332: | Line 345: | ||
</pre> | </pre> | ||
+ | |||
+ | == 15 (soluzione proposta su telegram) == | ||
<syntaxhighlight lang=C> | <syntaxhighlight lang=C> | ||
− | |||
− | |||
− | |||
#include <pthread.h> | #include <pthread.h> | ||
#include "semaphore.h" | #include "semaphore.h" | ||
Line 398: | Line 410: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
+ | |||
+ | |||
+ | == Correzioni proposte == |
Revision as of 17:31, 19 October 2022
In questa pagina sono presenti alcune soluzioni (possibilmente con errore) per l'esercizio C2 dell'esame 2022/09/06. Il lettore è invitato a immedesimare il professore al momento della correzione durante la lettura delle soluzioni.
1
semaphore sem(1); int sum=0; queue q; void sumstop(int v): if i < 0: q.enqueue(v) sem.P() else i-- int sumgo(void): for each elem in q: int val=q.dequeue() sum=sum + val return sum
2
queue values; semaphore s(0); int sum=0; void sumstop(int v): s.P() values.enqueue(v) int sumgo(void): while !value.isEmpty(): s.V() mutex.P() sum=sum+values.dequeue() mutex.v() return sum
3
shared int sum=0; semaphore wait(0); semaphore mutex(1); void sumstop(int v): mutex.P(); sum = sum + v; mutex.V(); wait.P(); int sumgo(void): wait.V(); somma = sum; mutex.P() sum = 0 mutex.V() return somma;
4
queue<int> processlist; semaphore mutex(1); semaphore s(0); void sumstop(int v): mutex.P(); processlist.enqueue(v); mutex.P(); S.P(); int sumgo(void): int sum = 0; mutex.P(); while processlist.top() != NULL: sum += processlist.dequeue(); S.V(); mutex.V() return sum;
5
int counter = 0; int sum = 0; semaphore mutex(1); semaphore blocked(0); void sumstop(int v): mutex.P(); sum+=v; counter++; mutex.V(); blocked.P(); int sumgo(void): mutex.P(); intret = sum; sum = 0; for (int i=0; i<counter; i++) blocked.V() counter = 0; mutex.V() return intret
6
int sum = 0; mutex = new semaphore(1); queue q; void sumstop(int v): mutex.P(); sum += v; sintpid = getpid(); suspend(pid); mutex.V(); int sumgo(void): mutex.P(); while !q.empty(): resume(q.dequeue()) int value = sum; sum = 0; return value;
7
int nP, nV = -1, 0; int somma = 0 int val[] semaphore mutex(1); semaphore s(0); void sumstop(int v): mutex.P() val[nP++].add[v] s.P() np-- v[0].delete int sumgo(void): mutex.P(); nV++ if nP > 0: s.V() for (int i=0; i<nV; i++) somma += val[i] nv-- else mutex.V() return somma
8
struct blocked { semaphore sem(0); int value = 0; }; semaphore mutex(1); list<blocked> procs = new list<blocked>(); void sumstop(int v): mutex.P() blocked bl = new blocked(); bl.value = v procs.add(bl) bl.sem.P() mutex.V() int sumgo(void): mutex.P(); int count = 0; foreach proc in procs: count += proc.value procs.remove(proc) proc.sem.V() mutex.V() return count;
== 9==
semaphore s[] new sem(0) semaphore s1 new sem(0) int tot, waiting = 0; void sumstop(int v): waiting++ s[waiting - 1].P() waiting-- tot = tot + v if waiting == 0: s1.V() int sumgo(void): if waiting = 0: return 0 for (i = waiting -1; i == 0; i--) s[i].V() s1.P() // per aspettare che tutti abbiano fatto la somma return tot
10
int nw = 0 int currsum = 0 semaphore mutex(1) semaphore wait2go(0) void sumstop(int v): mutex.P() currsum += v; nw++; mutex.V() wait2go.P() if --nw > 0: wait2go.V() else mutex.V() int sumgo(void): mutex.P(); if nw == 0: mutex.V() return 0; int sum = cursum; cursum = 0; wait2go.V(); return sum
11
semaphore mutex(1); semaphore semwait(0); int sum=0; int wait=0; void sumstop(int v): mutex.P() wait++ sum += v; mutex.V() semwait.P() mutex.P() wait--; mutex.V() if wait > 0: semwait.V() int sumgo(void): if wait == 0: return 0 semwait.V(); while (wait > 0) {} int val = sum mutex.P() sum = 0; mutex.V() return val;
12
semaphore mutex(0) volatile int counter = 0 void sumstop(int v): counter = counter + v; mutex.P() int sumgo(void): int val = counter; while (mutex.value != 0) mutex.V() counter = 0; return counter
13
semaphore mutex(1) int sum = 0; queue of semaphore q; void sumstop(int v): mutex.P() sum += v; s = new semaphore(0); q.enqueue(s) mutex.V() s.P() free(s) int sumgo(void): mutex.P() int lsum = sum sum = 0 while (!q.empty()): semaphore s = q.dequeue() s.V() mutex.V()
14
semaphore mutex(1) int sum = 0; queue of semaphore q; void sumstop(int v): mutex.P() sum += v; s = new semaphore(0); q.enqueue(s) mutex.V() s.P() free(s) if(q.empty()) mutex.V() else semaphore s = q.dequeue() s.V() int sumgo(void): mutex.P() int lsum = sum sum = 0 if(q.empty()) mutex.V() else semaphore s = q.dequeue() s.V()
15 (soluzione proposta su telegram)
#include <pthread.h>
#include "semaphore.h"
semaphore s; // semaforo che blocca le somme
semaphore finished; // semaforo che indica che le somme sono state fatte
semaphore critical_section; // sarà utilizzata per decidere chi entra nella critical section
volatile int sumstops = 0;
volatile int result;
void *sumstop(int v) {
semaphore_P(critical_section);
sumstops++;
semaphore_V(critical_section);
semaphore_P(s);
printf("summed %d\n", v);
result += v;
semaphore_V(finished);
}
int sumgo(void) {
semaphore_P(critical_section); // così sumstops è costante all'interno di questa section
result = 0;
for (int i = 0; i < sumstops; i++) {
semaphore_V(s); // permetti alla somma di andare
semaphore_P(finished); // aspetta che la somma sia finita prima di continuare
}
sumstops = 0; // reset number of blocked stops.
semaphore_V(critical_section);
return result;
}
void *run_sumgo(void) {
int res = sumgo();
printf("the result found is %d\n", res);
printf("the result found is %d\n", result);
}
int main() {
srand(time(NULL));
s = semaphore_create(0);
critical_section = semaphore_create(1);
finished = semaphore_create(0);
int n = rand() % 50;
pthread_t sumg, s[n];
for (int i = 0; i < n; i++) {
pthread_create(&s[i], NULL, sumstop, i);
}
pthread_create(&sumg, NULL, run_sumgo, NULL);
for (int i = 0; i < 10; i++) {
pthread_join(s[i], NULL);
}
pthread_join(sumg, NULL);
}