Apres avoir lu le tuto sur les API windows de bob, je me suis dit, "boaaa le multithread ca n'a pas l'air si compliqué que ca !!!" lol appriori du débutant en couche culotte.
J'ai quelques questions assez pointues qui s'adressent aux maitres dans l'art du multithreading, je vais essayer d'etre aussi concit et précis que possible, j'espere que ce topic ne découragera personne, j'ai vraiment besoin de comprendre. (vous donnez des cours?)
Je developpe en C++ sous visual 2003 mon appli est dédiée a des pc 32 ou 64bits sous XP Pro.
Situation : J'ai 2 thread A et B les 2 s'executent régulierement (cycliquement on pourait dire), et on ne peut pas savoir si A est lancé avant B ou l'inverse ou en "meme temps". Donc on ne peut encore moins savoir si une instruction foncA dans ThreadA est executée avant, ou apres foncB dans ThreadB.
Thread A ecris sur une variable toto, Thread B lit cette variable. Voici mon probleme à résoudre, je veux que quand threadA change l'etat de toto, ThreadB soit capable de lire le nouvel etat de toto et non son etat précédent ou suivant. Je rappelle que threadA s'execute cycliquement, lors de sa prochainne passe il pourra de nouveau modifier la valeur de toto, et il faut a tout prix que ThreadB catch toutes les valeurs que toto peut prendre.
Concretement ThreadA incremente à chaque passe toto et il faut absolument que thread B sur chacune de ses passe puisse lire toto==1 toto==2 toto==3 et non toto ==1 toto ==3 (toto==2 etant passé à la trappe).
Hypothese le cpu est réparti de la facon suivante :
30ms pour thread A
30ms pour thread B
100ms pour le kernel
et ca tourne en boucle
Contenu thread A :
foncLambda1()
toto=1
foncLambda2()
Contenu thread B
foncLambda1()
if(toto==1)
foncLambda2()
Sur une passe multithread, le hasard fait que :
execution / ThreadA::toto=1
threadA rend la main
threadB prend la main
execution / ThreadB::f(toto==1)
...
Voici enfin mes questions hyper pointue :
Question 1) est il possible que toto n'ai pas encore eu le temps de passer à 1 et que ThreadB lise un toto==0 ?
Question 2) est il possible pour des question d'optimisation, je pense particulierement à un proc 64bits traitant 2 infos 32bits sur un meme cycle d'horloge que l'on ait un truc du genre:
ThreadA::toto=1,ThreadB if(toto==1);
ou
ThreadB if(toto==1),ThreadA::toto=1; ??
Question3) quelle methode me conseilleriez vous pour etre sur que ThreadB lise toujours la bonne valeur de toto sans louper un cycle de ThreadA parcequ'il se met en attente?
J'ai plein d'autres questions sur le sujet, mais deja ca, c'est pas mal
Partager