editar y refinar mi pregunta después de recibir respuesta valiosa de Johannes¿Es necesario volátil aquí?
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();
}
}
lo tanto, vamos a olvidarnos de sincronización durante un tiempo. La pregunta es si b tiene que declararse volátil. He leído el estándar y conozco la definición formal de semántica volátil (incluso casi los entiendo, la palabra casi es la clave). Pero seamos un poco informales aquí. Si el compilador ve que en el bucle no hay forma de que b cambie, a menos que b sea volátil, puede optimizarlo y asumir que es equivalente a while(vb)
. La pregunta es, en este caso, que pf es en sí mismo volátil, ¿se le permite al compilador asumir que b no cambiará en el ciclo, incluso si b no es volátil?
Por favor absténgase de los comentarios y respuestas que abordan el estilo de este fragmento de código, este no es un ejemplo del mundo real, esta es una pregunta teórica experimental. Comentarios y respuestas que, además de responder a mi pregunta, también abordan la semántica de la volatilidad en mayor detalle que crees que he malentendido son muy bienvenidos.
Espero que mi pregunta sea clara. TIA
edición, una vez más:
qué pasa con esto?
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();
}
}
Hay una diferencia principal entre los dos programas. Si es así, ¿cuál es la diferencia?
No sé C muy bien. Si este código también es válido C (aparte de bool, que creo que no existe en C), dígame para que agregue la etiqueta C a la pregunta también –
es válida C si #include –
ybungalobill
primer código su pregunta, y luego pregunte. No es divertido cambiar constantemente la respuesta de uno. Además, ¿qué hilos se permiten cambiar (asumiendo la sincronización adecuada)? ¿Hay mutexes alrededor de ciertas partes? (es decir, alrededor de la parte "assign-pf + call") –