Pages: [1]   Go Down
Print
Author Topic: Mutua esclusione: problemi  (Read 2745 times)
0 Members e 1 Utente non registrato stanno visualizzando questa discussione.
milos224
Forumista
***
Offline Offline

Posts: 830


« on: 25-05-2012, 16:15:11 »

ALTERNANZA STRETTA.
Il codice è questo qui:

Primo processo (0)
Code:
while (true) do
while (turn != 0)
critical_region()
turn = 1
noncritical_region()

Secondo Processo (1)
Code:
while (true) do
while (turn != 1)
critical_region()
turn = 0
noncritical_region()

Il libro dice che inizialmente la variabile turn è 0. Il processo 0 controlla turn, si accorge che è zero ed entra nella sua regione critica. Ma già qui non mi quadrano le cose: il codice nel while ha "turn diverso da 0".. come fa il processo 0 a entrare nel while se turn all'inizio è 0? Non dovrebbe entrare sempre il processo 1 dato che nella condizione turn è diverso da 1?

Logged
ɹǝǝuıƃuǝsɹǝʌǝɹ
Administrator
God of the Forum
*****
Offline Offline

Gender: Male
Posts: 4.474


Più grande è la lotta, e più è glorioso il trionfo


WWW
« Reply #1 on: 25-05-2012, 16:17:59 »

Poiché non esiste nemmeno un punto e virgola, assumo che il linguaggio in cui è espresso il codice sia "pseudo-linguaggio".

A questo punto, è opportuno e necessario introdurre dei meccanismi per distinguere i blocchi dei rispettivi cicli (ad esempio parentesi graffe, coppie begin-end, oppure intentazioni annidate).
Poi sarà più chiaro, almeno per me, e potrò rispondere.
Logged

La grande marcia della distruzione mentale proseguirà. Tutto verrà negato. Tutto diventerà un credo. È un atteggiamento ragionevole negare l'esistenza delle pietre sulla strada; sarà un dogma religioso affermarla. È una tesi razionale pensare di vivere tutti in un sogno; sarà un esempio di saggezza mistica affermare che siamo tutti svegli. Accenderemo fuochi per testimoniare che due più due fa quattro. Sguaineremo spade per dimostrare che le foglie sono verdi in estate. Non ci resterà quindi che difendere non solo le incredibili virtù e saggezze della vita umana, ma qualcosa di ancora più incredibile: questo immenso, impossibile universo che ci guarda dritto negli occhi. Combatteremo per i prodigi visibili come se fossero invisibili. Guarderemo l'erba e i cieli impossibili con uno strano coraggio. Saremo tra coloro che hanno visto eppure hanno creduto.

In tutto, amare e servire.

  
                            ن                           
I can deal with ads,
I can deal with buffer,
but when ads buffer
I suffer...

...nutrimi, o Signore, "con il pane delle lacrime; dammi, nelle lacrime, copiosa bevanda...

   YouTube 9GAG    anobii  S  Steam T.B.o.I. Wiki [univ] Lezioni private  ʼ  Albo d'Ateneo Unicode 3.0.1
Usa "Search" prima di aprire un post - Scrivi sempre nella sezione giusta - Non spammare - Rispetta gli altri utenti - E ricorda di seguire il Regolamento
Il Capitano
Apprendista Forumista
**
Offline Offline

Posts: 409


« Reply #2 on: 25-05-2012, 17:02:51 »

Poiché non esiste nemmeno un punto e virgola, assumo che il linguaggio in cui è espresso il codice sia "pseudo-linguaggio".

A questo punto, è opportuno e necessario introdurre dei meccanismi per distinguere i blocchi dei rispettivi cicli (ad esempio parentesi graffe, coppie begin-end, oppure intentazioni annidate).
Poi sarà più chiaro, almeno per me, e potrò rispondere.

Eccolo

Code:
       while(TRUE){
               while(turno!=0);
               regione_critica();
               turno=1;
               regione_non_critica();
        }

        while(TRUE){
               while(turno!=1);
               regione_critica();
               turno=0;
               regione_non_critica();
        }

Da notare il ";" dopo il ciclo while.Ho copiato esattamente come è riportato sul libro
« Last Edit: 25-05-2012, 17:04:34 by Il Capitano » Logged
soad
Matricola
*
Offline Offline

Posts: 72


« Reply #3 on: 25-05-2012, 17:14:13 »

con il ; dopo il while finisce l'istruzione e quindi
ragionecritica() viene considerata fuori da while e quindi verrà sempre processata, indipendentemente dalla variabile turn
Logged
ɹǝǝuıƃuǝsɹǝʌǝɹ
Administrator
God of the Forum
*****
Offline Offline

Gender: Male
Posts: 4.474


Più grande è la lotta, e più è glorioso il trionfo


WWW
« Reply #4 on: 25-05-2012, 18:19:35 »

con il ; dopo il while finisce l'istruzione e quindi
ragionecritica() viene considerata fuori da while e quindi verrà sempre processata, indipendentemente dalla variabile turn
Falso!

Nella logica della mutua esclusione, il while con un punto e virgola subito dopo significa che si attende che la condizione diventi falsa, prima di passare alla prossima istruzione, che è proprio la sezione critica.
Quindi la relazione tra variabile turn e la sezione critica esiste, ma bisogna vederla al contrario (rispetto al normale modo di usare un while).

Adesso, con le dovute modifiche, si capisce bene che finché il turno non è il proprio (per il primo la variabile deve valere 0, per il secondo deve valere 1), si continua ad aspettare (cioè a ciclare), ma non appena il codice di uno dei due passa alla sezione critica, significa che l'altro codice ha settato la variabile turno con il turno dell'altro, e quindi il primo può iniziare a eseguire la sua sezione critica.

Il settaggio della variabile turn sul valore dell'altro turno è un modo di lasciare gentilmente che l'altro codice possa iniziare la sua sezione critica cedendo il comando .
Logged

La grande marcia della distruzione mentale proseguirà. Tutto verrà negato. Tutto diventerà un credo. È un atteggiamento ragionevole negare l'esistenza delle pietre sulla strada; sarà un dogma religioso affermarla. È una tesi razionale pensare di vivere tutti in un sogno; sarà un esempio di saggezza mistica affermare che siamo tutti svegli. Accenderemo fuochi per testimoniare che due più due fa quattro. Sguaineremo spade per dimostrare che le foglie sono verdi in estate. Non ci resterà quindi che difendere non solo le incredibili virtù e saggezze della vita umana, ma qualcosa di ancora più incredibile: questo immenso, impossibile universo che ci guarda dritto negli occhi. Combatteremo per i prodigi visibili come se fossero invisibili. Guarderemo l'erba e i cieli impossibili con uno strano coraggio. Saremo tra coloro che hanno visto eppure hanno creduto.

In tutto, amare e servire.

  
                            ن                           
I can deal with ads,
I can deal with buffer,
but when ads buffer
I suffer...

...nutrimi, o Signore, "con il pane delle lacrime; dammi, nelle lacrime, copiosa bevanda...

   YouTube 9GAG    anobii  S  Steam T.B.o.I. Wiki [univ] Lezioni private  ʼ  Albo d'Ateneo Unicode 3.0.1
Usa "Search" prima di aprire un post - Scrivi sempre nella sezione giusta - Non spammare - Rispetta gli altri utenti - E ricorda di seguire il Regolamento
soad
Matricola
*
Offline Offline

Posts: 72


« Reply #5 on: 25-05-2012, 18:38:11 »

mi scuso allora
Logged
milos224
Forumista
***
Offline Offline

Posts: 830


« Reply #6 on: 25-05-2012, 19:47:10 »

con il ; dopo il while finisce l'istruzione e quindi
ragionecritica() viene considerata fuori da while e quindi verrà sempre processata, indipendentemente dalla variabile turn
Falso!

Nella logica della mutua esclusione, il while con un punto e virgola subito dopo significa che si attende che la condizione diventi falsa, prima di passare alla prossima istruzione, che è proprio la sezione critica.
Quindi la relazione tra variabile turn e la sezione critica esiste, ma bisogna vederla al contrario (rispetto al normale modo di usare un while).

Adesso, con le dovute modifiche, si capisce bene che finché il turno non è il proprio (per il primo la variabile deve valere 0, per il secondo deve valere 1), si continua ad aspettare (cioè a ciclare), ma non appena il codice di uno dei due passa alla sezione critica, significa che l'altro codice ha settato la variabile turno con il turno dell'altro, e quindi il primo può iniziare a eseguire la sua sezione critica.

Il settaggio della variabile turn sul valore dell'altro turno è un modo di lasciare gentilmente che l'altro codice possa iniziare la sua sezione critica cedendo il comando .
Il codice è proprio quello che ha postato quel ragazzo.
Allora, quale dei due processi inizierà prima? Il processo 1 no?
Logged
ɹǝǝuıƃuǝsɹǝʌǝɹ
Administrator
God of the Forum
*****
Offline Offline

Gender: Male
Posts: 4.474


Più grande è la lotta, e più è glorioso il trionfo


WWW
« Reply #7 on: 25-05-2012, 23:14:24 »

Allora, quale dei due processi inizierà prima? Il processo 1 no?
Con questi pochi dati forniti, non si può rispondere con certezza.

Bisognerebbe verificare, ad esempio, il valore presente nella variabile turn prima del lancio dei processi (o del primo di loro, se vengono lanciati in modo asincrono).
Logged

La grande marcia della distruzione mentale proseguirà. Tutto verrà negato. Tutto diventerà un credo. È un atteggiamento ragionevole negare l'esistenza delle pietre sulla strada; sarà un dogma religioso affermarla. È una tesi razionale pensare di vivere tutti in un sogno; sarà un esempio di saggezza mistica affermare che siamo tutti svegli. Accenderemo fuochi per testimoniare che due più due fa quattro. Sguaineremo spade per dimostrare che le foglie sono verdi in estate. Non ci resterà quindi che difendere non solo le incredibili virtù e saggezze della vita umana, ma qualcosa di ancora più incredibile: questo immenso, impossibile universo che ci guarda dritto negli occhi. Combatteremo per i prodigi visibili come se fossero invisibili. Guarderemo l'erba e i cieli impossibili con uno strano coraggio. Saremo tra coloro che hanno visto eppure hanno creduto.

In tutto, amare e servire.

  
                            ن                           
I can deal with ads,
I can deal with buffer,
but when ads buffer
I suffer...

...nutrimi, o Signore, "con il pane delle lacrime; dammi, nelle lacrime, copiosa bevanda...

   YouTube 9GAG    anobii  S  Steam T.B.o.I. Wiki [univ] Lezioni private  ʼ  Albo d'Ateneo Unicode 3.0.1
Usa "Search" prima di aprire un post - Scrivi sempre nella sezione giusta - Non spammare - Rispetta gli altri utenti - E ricorda di seguire il Regolamento
milos224
Forumista
***
Offline Offline

Posts: 830


« Reply #8 on: 25-05-2012, 23:31:24 »

Allora, quale dei due processi inizierà prima? Il processo 1 no?
Con questi pochi dati forniti, non si può rispondere con certezza.

Bisognerebbe verificare, ad esempio, il valore presente nella variabile turn prima del lancio dei processi (o del primo di loro, se vengono lanciati in modo asincrono).
0 il libro dice che all'inizio la variabile è 0.
Logged
LtWorf
Forumista Esperto
****
Offline Offline

Posts: 1.079

Ogni cosa da me scritta è da intendersi come opinione personale e non come dato di fatto. Anche le eventuali dimostrazioni matematiche da me scritte saranno opinioni personali e quindi dovranno venire dimostrate da una terza parte di fiducia


WWW
« Reply #9 on: 01-06-2012, 10:53:15 »

Se all'inizio è 0 (come era già stato scritto nel primo post), allora sarà la regione critica del 2o processo ad essere eseguita per prima, dato che 0!=1.
Logged

There are some OO programming languages. I will create the first -_-' language.

LtWorf
ɹǝǝuıƃuǝsɹǝʌǝɹ
Administrator
God of the Forum
*****
Offline Offline

Gender: Male
Posts: 4.474


Più grande è la lotta, e più è glorioso il trionfo


WWW
« Reply #10 on: 01-06-2012, 14:33:26 »

Se all'inizio è 0 (come era già stato scritto nel primo post), allora sarà la regione critica del 2o processo ad essere eseguita per prima, dato che 0!=1.

Casomai il primo allora, dato che appunto 0!=0 è falso, è quindi il primo while esce subito per eseguire la sua sezione critica. pray
Logged

La grande marcia della distruzione mentale proseguirà. Tutto verrà negato. Tutto diventerà un credo. È un atteggiamento ragionevole negare l'esistenza delle pietre sulla strada; sarà un dogma religioso affermarla. È una tesi razionale pensare di vivere tutti in un sogno; sarà un esempio di saggezza mistica affermare che siamo tutti svegli. Accenderemo fuochi per testimoniare che due più due fa quattro. Sguaineremo spade per dimostrare che le foglie sono verdi in estate. Non ci resterà quindi che difendere non solo le incredibili virtù e saggezze della vita umana, ma qualcosa di ancora più incredibile: questo immenso, impossibile universo che ci guarda dritto negli occhi. Combatteremo per i prodigi visibili come se fossero invisibili. Guarderemo l'erba e i cieli impossibili con uno strano coraggio. Saremo tra coloro che hanno visto eppure hanno creduto.

In tutto, amare e servire.

  
                            ن                           
I can deal with ads,
I can deal with buffer,
but when ads buffer
I suffer...

...nutrimi, o Signore, "con il pane delle lacrime; dammi, nelle lacrime, copiosa bevanda...

   YouTube 9GAG    anobii  S  Steam T.B.o.I. Wiki [univ] Lezioni private  ʼ  Albo d'Ateneo Unicode 3.0.1
Usa "Search" prima di aprire un post - Scrivi sempre nella sezione giusta - Non spammare - Rispetta gli altri utenti - E ricorda di seguire il Regolamento
Pages: [1]   Go Up
Print
Jump to: