curato e raffinato la mia domanda dopo la risposta di valore di JohannesÈ volatile richiesto qui?
bool b = true;
volatile bool vb = true;
void f1() { }
void f2() { b = false; }
void(* volatile pf)() = &f1; //a volatile pointer to function
int main()
{
//different threads start here, some of which may change pf
while(b && vb)
{
pf();
}
}
Quindi, cerchiamo di dimenticare la sincronizzazione per un po '. La domanda è se b deve essere dichiarato volatile. Ho letto lo standard e il tipo di conoscenza della definizione formale di semantica volatile (li ho quasi capiti, la parola è quasi la chiave). Ma siamo un po 'informali qui. Se il compilatore vede che nel ciclo non c'è modo per cambiare b allora a meno che b non sia volatile, può ottimizzarlo e assumere che sia equivalente a while(vb)
. La domanda è, in questo caso, pf è esso stesso volatile, così il compilatore ha la possibilità di assumere che b non cambierà nel ciclo anche se b non è volatile?
Si prega di astenersi da commenti e risposte che affrontano lo stile di questo pezzo di codice, questo non è un esempio del mondo reale, questa è una domanda teorica sperimentale. Commenti e risposte che, oltre a rispondere alla mia domanda, affronteranno anche la semantica di volatili in modo più dettagliato e che pensate di aver frainteso sono molto ben accette.
Spero che la mia domanda sia chiara. TIA
Editing una volta di più:
che dire di questo?
bool b = true;
volatile bool vb = true;
void f1() {}
void f2() {b = false;}
void (*pf)() = &f1;
#include <iosrteam>
int main()
{
//threads here
while(b && vb)
{
int x;
std::cin >> x;
if(x == 0)
pf = &f1;
else
pf = &f2;
pf();
}
}
C'è una differenza principale tra i due programmi. Se sì, qual è la differenza?
Non conosco C molto bene. Se questo codice è valido anche C (a parte il bool che credo non esista in C), per favore dimmi che aggiungo anche il tag C alla domanda –
è valido C se si #include –
ybungalobill
si prega di primo codice la tua domanda, e poi chiedi. Non è divertente cambiare continuamente la propria risposta. Inoltre, quali sono i thread autorizzati a cambiare (presupponendo una corretta sincronizzazione)? Ci sono mutex attorno a certe parti? (intorno alla parte "assign-pf + call"?) –