EDITED und verfeinert meine Frage nach Johannes wertvolle AntwortIst volatile hier erforderlich?
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();
}
}
So lassen Sie uns Synchronisation für eine Weile vergessen. Die Frage ist, ob b für volatil erklärt werden muss. Ich habe den Standard gelesen und kenne die formale Definition der flüchtigen Semantik (ich verstehe sie sogar fast, das Wort ist fast der Schlüssel). Aber lass uns ein wenig informell sein. Wenn der Compiler sieht, dass es in der Schleife keine Möglichkeit gibt, b zu ändern, dann, wenn b nicht flüchtig ist, kann er es optimieren und annehmen, dass es while(vb)
entspricht. Die Frage ist, in diesem Fall ist pf selbst flüchtig, also darf der Compiler annehmen, dass sich b in der Schleife nicht ändert, selbst wenn b nicht flüchtig ist?
Bitte verzichten Sie auf Kommentare und Antworten, die den Stil dieses Codeabschnittes ansprechen, dies ist kein reales Beispiel, dies ist eine experimentelle theoretische Frage. Kommentare und Antworten, die, abgesehen von der Beantwortung meiner Frage, auch die Semantik der volatilen in größerem Detail ansprechen, die Sie meiner Meinung nach missverstanden haben, sind sehr willkommen.
Ich hoffe meine Frage ist klar. TIA
Schnitt einmal mehr:
was ist das?
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();
}
}
Gibt es einen prinzipiellen Unterschied zwischen den beiden Programmen? Wenn ja, worin besteht der Unterschied?
Ich weiß nicht sehr gut C. Wenn dieser Code auch gültig ist C (außer Bool, das ich glaube nicht in C vorhanden), bitte sagen Sie mir, dass ich das C-Tag auch der Frage hinzufügen –
es ist gültig C, wenn Sie # –
ybungalobill
bitte ersten Code deine Frage stellen und dann fragen. Es macht keinen Spaß, seine Antwort ständig zu ändern. Was dürfen die Threads ändern (unter der Voraussetzung einer korrekten Synchronisation)? Gibt es Mutexe um bestimmte Teile? (d. h. um den "assign-pf + call" -Teil?) –