Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- i. f(a,b,c)=< binrandom()==0 ? (a=b, b=c) : (c=b,b=a) > /*binrandom genera un numero binario random */
- Puo essere usata come t& s
- int g=0 //0=libera, 1=occupata
- void entercs(void){
- int l;
- do{
- l=1;
- f(l,g,l); //qualsiasi cosa prenda si comporta come swap
- }while(l !=0)
- }
- void exitcs(void){
- f(0,g,0); //viene settato in ogni caso
- }
- foo(void **x, void **y) {
- *x = *y;
- *y = x;
- }
- e' possibile usare foo al posto della test&set? (Se si': spiegare bene come funziona il codice presentato come soluzione,
- se no: spiegare bene i motivi dell'impossibilita' ).
- soluzione:
- x=1 *x=2 ***x=3
- y=4 *y=5 ***y=6
- *x= 5
- *y= 1
- *(*x)=6
- *(*y)=5
- Si può usare come t&s basta che io vada a cambiare sempre il valore di *y siccome io trovo sempre che *x=x e se vado a cambiare il valore di *y di conseguenza con l'assegnamento *y=x mi viene sempre data la condizione *x!=x che è quella che io cercavo.
- global=0x11 // indirizzo di memoria (valore non nullo)
- int *local=null
- while(true){
- do{
- foo(local,global); -> local= 0x11 global=null
- }while(local!=null); -> va in loop perchè rispetta la condizione
- critical section
- global=0x11;
- non critical section
- }
- foo(x,y) = <x1=x+1, y1=y+1, x=y1, y=x1> (con x, y interi)
- E' possibile usarla come test & set siccome il valore di x è sempre il valore assunto in precedenza da y1 e viceversa per y
- soluzione:
- int global=1;
- while(true){
- do{
- int local=1;
- foo(local,global);
- }while(local != global);
- critical section
- ...
- global=1;
- non critical section
- }
Add Comment
Please, Sign In to add comment