Lors de l'écriture de programmes C qui doivent partager une variable de portée de fichier entre l'application et une routine d'interruption/un thread/une routine de callback, il est bien connu que la variable doit être déclarée volatile, sinon le compilateur peut effectuer des optimisations incorrectes. Voici un exemple de ce que je veux dire :
int flag;
void some_interrupt (void)
{
flag = 1;
}
int main()
{
flag = 0;
...
/* <-- interrupt occurs here */
x = flag; /* BUG: the compiler doesn't realize that "flag" was changed
and sets x to 0 even though flag==1 */
}
Pour éviter le bogue ci-dessus, "flag" aurait dû être déclaré comme volatile.
Ma question est la suivante : comment cela s'applique-t-il au C++ lors de la création d'une classe contenant un thread ?
J'ai une classe qui ressemble à quelque chose comme ça :
class My_thread
{
private:
int flag;
static void thread_func (void* some_arg) // thread callback function
{
My_thread* this_ptr= (My_thread*)some_arg;
}
};
"some_arg" contiendra un pointeur vers une instance de la classe, de sorte que chaque objet de "My_thread" possède son propre thread. Grâce à ce pointeur, il accédera aux variables membres.
Cela signifie-t-il que "this_ptr" doit être déclaré comme un pointeur vers des données volatiles ? Le "flag" doit-il également être volatil ? Et si oui, dois-je rendre volatiles toutes les fonctions membres qui modifient "flag" ?
Je ne suis pas intéressé par le comportement d'un système d'exploitation ou d'un compilateur particulier, je cherche une solution générique et totalement portable.
EDIT : Cette question n'a rien à voir avec la sécurité des fils.
Le vrai code aura des sémaphores, etc.
Pour clarifier, je souhaite éviter les bogues causés par l'ignorance du compilateur du fait qu'une fonction de rappel peut être appelée depuis des sources extérieures au programme lui-même, et donc tirer des conclusions incorrectes sur l'utilisation ou non de certaines variables. Je sais comment faire cela en C, comme l'illustre le premier exemple, mais pas en C++.