Précédent   Forum du club des développeurs et IT Pro > C et C++ > C > Bibliothèques, systèmes et outils > POSIX
POSIX Forum d'entraide sur le standard POSIX
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 25/02/2013, 22h26   #1
moktar_bouain
 
Homme
Chercheur en informatique
Inscription : mars 2011
Messages : 19
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Tunisie

Informations professionnelles :
Activité : Chercheur en informatique
Secteur : Enseignement

Informations forums :
Inscription : mars 2011
Messages : 19
Points : -8
Points : -8
Par défaut Pourquoi le temps d'exécution s'augmente avec pthread ?

Bonsoir à tous,

J'ai une question concernant la programmation pthread.
J'ai réalisé une programme qui contient un seul thread dans la fonction main().
J'ai mesuré le temps d'exécution j'ai constaté que ce temps est augmenté de 60 % par rapport au programme original(séquentiel).
Mais c'est pas logique ce résultat ??

Merci.
moktar_bouain est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/02/2013, 02h36   #2
djuju
Membre éprouvé
 
Homme Julien
Chef de projet R&D
Inscription : mars 2007
Messages : 183
Détails du profil
Informations personnelles :
Nom : Homme Julien
Localisation : Canada

Informations professionnelles :
Activité : Chef de projet R&D

Informations forums :
Inscription : mars 2007
Messages : 183
Points : 408
Points : 408
Salut Moktar,

Si je comprend bien, tu as pris les code qui était exécuté depuis ton main, tu l'as mis dans un thread et c'est tout. Dans ce cas, il est tout à fait logique que ton code s'exécute plus lentement. Il faut être conscient que l'utilisation d'un thread a un cout. Lorsque tu le démarre d'abord. Mais surtout, la machine va régulièrement passer de l'exécution d'un thread a un autre, ce qui implique plusieurs accès mémoire, avec empilement/dépilement sur la stack du contexte de chaque thread et branchement du pointeur ordinal.
Les threads deviennent intéressants lorsque plusieurs opérations peuvent ou doivent se faire en parallèle. Dans ce cas, et notamment dans un contexte multiprocesseurs, tu auras des gains performances.
Par exemple, les algorithmes diviser pour régner s'adaptent très bien aux threads. Les problèmes producer/consumer aussi.
Note que le cout d'exécution de tes threads ne doit pas être supérieur au gain de la parallélisation. Tes problèmes doivent donc avoir une certaine taille.

Un exo simple et rapide pour voir le gain apporté par un thread est de créer un tableau de booléens aléatoire et de compter les "true". D'un coté, tu fais un algo itératif bête et méchant. D'un autre coté tu fais un algo avec autant de threads que ton CPU a de cores.
Compare les performances sur un tableau de 2 millions d'éléments et sur un de seulement 4 éléments. Sur le tableau de 2 millions l'algo threadé devrait gagner et sur celui de 4 il devrait perdre.

A+
djuju est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 26/02/2013, 07h58   #3
Bktero
Expert Confirmé Sénior
 
Avatar de Bktero
 
Ingénieur systèmes embarqués
Inscription : juin 2009
Messages : 1 708
Détails du profil
Informations personnelles :
Âge : 25
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Ingénieur systèmes embarqués
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juin 2009
Messages : 1 708
Points : 4 188
Points : 4 188
djuju a raison : les threads coûtent car il faut passer d'un thread à l'autre, il y a le coût de démarrage des threads, etc.

Il faut aussi être conscient que mesurer le temps d'un petit programme puis le temps d'un autre petit programme n'est pas évident, surtout si petit signifie "faible temps d'exécution". Il y a plein d'autres programmes sans doute plus prioritaire sur ton PC au même moment, qui te dit que ce n'est pas ton OS qui a laissé ton programme threadé sur le carreau pour donner la main à un autre programme qui en avait plus besoin ? Il ne faut pas se baser sur un temps de mesure mais sur un ensemble de mesures et il faut que le temps d'exécution soit suffisamment long pour que les aléas du scheduling de l'OS soit gommé.

Citation:
D'un autre coté tu fais un algo avec autant de threads que ton CPU a de cores
En supposant que ton OS gère correctement le multicoeur, ce qui d'après une discussion au boulot l'autre jour serait rarement le cas. Ce qui disait les collègues en substance est que tu gagneras mais pas forcément autant qu'on pourrait le souhaiter / l'espérer...
__________________
Si Code::Blocks vous dit undefined reference to 'socket@12', cela signifie que vous avez un problème d'édition des liens. Allez dans Projects / Build Options / Linker Settings / Add et renseigner ici les .a qui vont bien. Exemple pour les sockets : C:\Program Files\CodeBlocks\MinGW\lib\libws2_32.a

Pour les adeptes du langage SMS, allez ici et ramenez la traduction française ^^

Pour vos problèmes d'embarqué, utilisez le forum dédié !
Bktero est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/02/2013, 13h32   #4
matafan
Membre Expert
 
Homme
Ingénieur développement logiciels
Inscription : octobre 2008
Messages : 1 482
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 34
Localisation : France

Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : octobre 2008
Messages : 1 482
Points : 2 438
Points : 2 438
Ca n'a rien à voir avec le fait que le système a à passer d'un thread à l'autre. Tu n'as qu'un thread, il n'y a donc pas de scheduling en plus.

Par contre, le fait de te linker avec la libpthreads va compiler ton code en mode thread-safe, et de nombreuses fonctions de la librairies standard auront en plus à prendre des locks qu'elles ne prennent pas en mode threadé. La différence de perfs vient de là.
matafan est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 26/02/2013, 13h58   #5
Bktero
Expert Confirmé Sénior
 
Avatar de Bktero
 
Ingénieur systèmes embarqués
Inscription : juin 2009
Messages : 1 708
Détails du profil
Informations personnelles :
Âge : 25
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Ingénieur systèmes embarqués
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juin 2009
Messages : 1 708
Points : 4 188
Points : 4 188
Si tu crées, un thread cela en fait 2 avec le thread du main(), non ?

Sinon, une application si simple n'est pas franchement impactée par le scheduling, ma phrase se plaçait dans un contexte plus général de multi-threading.
__________________
Si Code::Blocks vous dit undefined reference to 'socket@12', cela signifie que vous avez un problème d'édition des liens. Allez dans Projects / Build Options / Linker Settings / Add et renseigner ici les .a qui vont bien. Exemple pour les sockets : C:\Program Files\CodeBlocks\MinGW\lib\libws2_32.a

Pour les adeptes du langage SMS, allez ici et ramenez la traduction française ^^

Pour vos problèmes d'embarqué, utilisez le forum dédié !
Bktero est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 26/02/2013, 14h59   #6
djuju
Membre éprouvé
 
Homme Julien
Chef de projet R&D
Inscription : mars 2007
Messages : 183
Détails du profil
Informations personnelles :
Nom : Homme Julien
Localisation : Canada

Informations professionnelles :
Activité : Chef de projet R&D

Informations forums :
Inscription : mars 2007
Messages : 183
Points : 408
Points : 408
Citation:
Envoyé par Bktero Voir le message
En supposant que ton OS gère correctement le multicoeur, ce qui d'après une discussion au boulot l'autre jour serait rarement le cas. Ce qui disait les collègues en substance est que tu gagneras mais pas forcément autant qu'on pourrait le souhaiter / l'espérer...
Tout à fait. Ce n'est pas parce que tu lance 4 threads sur un quad-core qu'il y en aura 1 par core. Tout d'abord, parce que tu as d'autre process qui tourne sur ta machine, ensuite parce que c'est ton OS qui décide du scheduling de chaque thread pour chaque core. Il y a des mécanismes d'affinité pour affecter un thread à un core précis, il vaut donc mieux le laisser faire.
Anyway, le but ici n'est que de donner un exemple simple de gain de perf avec les threads. Quand on débute avec les threads, je pense qu'il vaut mieux ne pas trop entrer ces détails.

Citation:
Ca n'a rien à voir avec le fait que le système a à passer d'un thread à l'autre. Tu n'as qu'un thread, il n'y a donc pas de scheduling en plus.
Comme l'a dit Bktero, tu as un main qui lance un thread, puis l'attend, tu as donc 2 threads. Il faudra bien scheduler entre les 2 pour vérifier si la condition d'attente du main (un mutex ou autre objet de synchro) est remplie et donc s'il faut réveiller le main thread.

Citation:
Par contre, le fait de te linker avec la libpthreads va compiler ton code en mode thread-safe, et de nombreuses fonctions de la librairies standard auront en plus à prendre des locks qu'elles ne prennent pas en mode threadé. La différence de perfs vient de là.
Effectivement, c'est tout à fait possible ça vienne de là. Mais, vu qu'on a pas le code, on fait tous des plans sur la comète depuis le début. Je sais bien que ces mesures ne sont pas précises, mais Moktar à 60% de différence entre ces versions de code. Pour avoir 60%, cela me donne l'impression que le temps d'exécution de son thread est très petit et que donc l'overhead vient de l'utilisation des threads. J'ai l'impression que si c'était la synchro du mode htread-safe qui ralentissait le code, l'overhead serait moins important.
Anyway, que l'overhead vienne du cout des threads, du mode thread-safe ou des 2, tu fais bien de soulever cet aspect, car c'est un point important => Compiler thread-safe a un cout.
djuju est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/02/2013, 17h00   #7
transgohan
Expert Confirmé
 
Avatar de transgohan
 
Homme Baptiste ROUSSEL
Développeur Temps réel Embarqué
Inscription : janvier 2011
Messages : 1 296
Détails du profil
Informations personnelles :
Nom : Homme Baptiste ROUSSEL
Localisation : France, Territoire de Belfort (Franche Comté)

Informations professionnelles :
Activité : Développeur Temps réel Embarqué

Informations forums :
Inscription : janvier 2011
Messages : 1 296
Points : 2 871
Points : 2 871
Citation:
Envoyé par djuju Voir le message
Comme l'a dit Bktero, tu as un main qui lance un thread, puis l'attend, tu as donc 2 threads. Il faudra bien scheduler entre les 2 pour vérifier si la condition d'attente du main (un mutex ou autre objet de synchro) est remplie et donc s'il faut réveiller le main thread.
Non tu n'as pas de scheduling entre le main et le thread tant que le thread ne rend pas la main (pthread_exit) si le thread a été créé en mode attaché (en mode détaché on aura par contre le thread qui s'exécute en parallèle du main qui poursuit son traitement).
Le premier changement de contexte se ferra donc uniquement lors du pthread_exit.
C'est le principe de l'utilisation des signaux dans un OS. Sinon on n'utiliserai pas de signaux mais un simple flag qu'on vérifierai à chaque ordonnancement.

Pour moi ce temps vient de l'aspect thread-safe. Cela rajoute un bon nombre de delta non négligeables sur un bon nombre de fonctions. Et donc ce 60% ne me paraît pas bizarre.
__________________
Toujours se souvenir que la majorité des ennuis viennent de l'espace occupé entre la chaise et l'écran de l'ordinateur.
transgohan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/02/2013, 17h06   #8
matafan
Membre Expert
 
Homme
Ingénieur développement logiciels
Inscription : octobre 2008
Messages : 1 482
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 34
Localisation : France

Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : octobre 2008
Messages : 1 482
Points : 2 438
Points : 2 438
Ah non ça c'est totalement faux par contre. Que le deuxième thread soit créé en mode attaché ou détaché ne change rien au scheduling ; dans tous les cas les deux threads s’exécutent en parallèle. La différence concerne seulement la terminaison du threads.
matafan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/02/2013, 17h53   #9
Obsidian
Modérateur
 
Avatar de Obsidian
 
Homme
Chercheur d'emploi
Inscription : septembre 2007
Messages : 4 614
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 36
Localisation : France, Essonne (Île de France)

Informations professionnelles :
Activité : Chercheur d'emploi
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : septembre 2007
Messages : 4 614
Points : 11 090
Points : 11 090
Citation:
Envoyé par matafan Voir le message
Par contre, le fait de te linker avec la libpthreads va compiler ton code en mode thread-safe, et de nombreuses fonctions de la librairies standard auront en plus à prendre des locks qu'elles ne prennent pas en mode threadé. La différence de perfs vient de là.
C'est vrai mais de là à faire 60 % de différence, il y a quand même une certaine distance à franchir. Donc soit l'ensemble analysé est trop restreint pour que les mesures soient pertinentes (s'il fait une boucle sur trois éléments, c'est assurément le coût de création du thread qui sera de loin le plus élevé :-) ), soit il y a des effets de bord comme des barrières de synchro mal placées et/ou injustifiées.

Donc, sans voir le code, on ne pourra pas tirer de conclusions pertinentes…
Obsidian est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/02/2013, 18h12   #10
transgohan
Expert Confirmé
 
Avatar de transgohan
 
Homme Baptiste ROUSSEL
Développeur Temps réel Embarqué
Inscription : janvier 2011
Messages : 1 296
Détails du profil
Informations personnelles :
Nom : Homme Baptiste ROUSSEL
Localisation : France, Territoire de Belfort (Franche Comté)

Informations professionnelles :
Activité : Développeur Temps réel Embarqué

Informations forums :
Inscription : janvier 2011
Messages : 1 296
Points : 2 871
Points : 2 871
Citation:
Envoyé par matafan Voir le message
Ah non ça c'est totalement faux par contre. Que le deuxième thread soit créé en mode attaché ou détaché ne change rien au scheduling ; dans tous les cas les deux threads s’exécutent en parallèle. La différence concerne seulement la terminaison du threads.
Si le thread est en mode attaché le main est donc en état d'endormissement.
Il n'est réveillé que sur réception de certains signaux en provenance de son thread lancé ou d'un process extérieur (chose assez rare sauf si vous l'avez explicitement programmé).
On peut donc simplifier en disant que le main ne sera absolument pas ordonnancé (il restera endormi) jusqu'à l'envoi du signal par le thread lors du pthread_exit.

A contrario avec un thread lancé en mode détaché, le main n'est pas endormi et donc poursuit son exécution. On a donc un ordonnancement de cette tâche.

Et si on veut être pointilleux je devrai vous reprocher le fait d'appeler un main un thread car ce n'est absolument pas la même chose suivant l'OS.
Sur certains OS le main sera identifié par l'id de process, tandis que sur d'autres OS il sera aussi identifié par un id de thread. Et on retrouve aussi d'autres OS qui fonctionnent par tâche et non par process/thread à l'ordonnancement.
__________________
Toujours se souvenir que la majorité des ennuis viennent de l'espace occupé entre la chaise et l'écran de l'ordinateur.
transgohan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/02/2013, 19h11   #11
moktar_bouain
 
Homme
Chercheur en informatique
Inscription : mars 2011
Messages : 19
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Tunisie

Informations professionnelles :
Activité : Chercheur en informatique
Secteur : Enseignement

Informations forums :
Inscription : mars 2011
Messages : 19
Points : -8
Points : -8
Bonsoir à tous,

Merci pour vos réponse.
Je travaille sur le code d'un codeur H.264, il est très long, ce pourquoi je l'ai pas postulé. Ci-joint une figure qui explique le programme séquentiel et parallèle. Donc c'est que j'ai fait ce de créer un thread "Encode_chroma_MB" qui sera traité en parallèle avec la fonction main(), alors j'ai un processus qui est la fonction main() et un thread.
Le problème est que le temps d'exécution augmente avec plus de 60%.
Donc j'ai essayé de faire un teste,calculer seulement le temps d'exécution de thread. J'ai trouvé que le temps augmente même si le corps de thread est vide, c'est dire aucune instructions exécutés dans le thread. C'est bizarre ,non ??
C'est à dire lorsque je mets pthread_create () dans mon programme cela me coute presque 78 ms !!!!!

Merci,
Moktar.
Images attachées
Type de fichier : png code.PNG (64,8 Ko, 12 affichages)
moktar_bouain est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/02/2013, 19h12   #12
djuju
Membre éprouvé
 
Homme Julien
Chef de projet R&D
Inscription : mars 2007
Messages : 183
Détails du profil
Informations personnelles :
Nom : Homme Julien
Localisation : Canada

Informations professionnelles :
Activité : Chef de projet R&D

Informations forums :
Inscription : mars 2007
Messages : 183
Points : 408
Points : 408
Citation:
Envoyé par transgohan Voir le message
Si le thread est en mode attaché le main est donc en état d'endormissement.
Il n'est réveillé que sur réception de certains signaux en provenance de son thread lancé ou d'un process extérieur (chose assez rare sauf si vous l'avez explicitement programmé).
On peut donc simplifier en disant que le main ne sera absolument pas ordonnancé (il restera endormi) jusqu'à l'envoi du signal par le thread lors du pthread_exit.

A contrario avec un thread lancé en mode détaché, le main n'est pas endormi et donc poursuit son exécution. On a donc un ordonnancement de cette tâche.

Et si on veut être pointilleux je devrai vous reprocher le fait d'appeler un main un thread car ce n'est absolument pas la même chose suivant l'OS.
Sur certains OS le main sera identifié par l'id de process, tandis que sur d'autres OS il sera aussi identifié par un id de thread. Et on retrouve aussi d'autres OS qui fonctionnent par tâche et non par process/thread à l'ordonnancement.
Ca fait un moment que je n'ai plus fait de pthread, mais si mes souvenirs sont bons, il y a le mode dettached et joinable. J’imagine que c'est ce que tu veux dire par mode attaché/détaché. Encore une fois, si mes souvenirs sont bons, la seule différence est qu'en mode joinable, lorsque le thread termine, le contexte du thread n'est pas libéré pour que tu puisse faire ton pthread_join(). Si tu es en mode dettached, le contexte est libéré tout seul, puisqu'il n'y aura pas d'appel à pthread_join().

Par ailleurs, un thread endormi, que ce soit sur un wait, un lock, un join, un sleep ou autre sera quand même schedulé. Lorsqu'un thread "s’endort", il est sortie de sa queue de priorité sur du scheduler pour être mis dans la queue des threads endormis. Régulièrement, le schéduler va parcourir cette queue pour vérifier si certain ne sont pas signalés ou tombés en timeout. Si c'est le cas, le thread est sorti de la queue "dormante" pour être remis dans sa queue de priorité. Donc, même si l'overhead d'une telle attente est foncièrement inférieur qu'une attente active, il y a quand même scheduling.
djuju est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 26/02/2013, 20h24   #13
Bktero
Expert Confirmé Sénior
 
Avatar de Bktero
 
Ingénieur systèmes embarqués
Inscription : juin 2009
Messages : 1 708
Détails du profil
Informations personnelles :
Âge : 25
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Ingénieur systèmes embarqués
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juin 2009
Messages : 1 708
Points : 4 188
Points : 4 188
Citation:
Envoyé par transgohan Voir le message
Non tu n'as pas de scheduling entre le main et le thread tant que le thread ne rend pas la main (pthread_exit) si le thread a été créé en mode attaché (en mode détaché on aura par contre le thread qui s'exécute en parallèle du main qui poursuit son traitement).
Le premier changement de contexte se ferra donc uniquement lors du pthread_exit.
Je ne suis pas un spécialiste des pthreads en particulier mais en raisonnant d'un point de vue général, il y a quelque chose de faux dans ton raisonnement. Si dans la fonction main(), tu crées un thread, que le main() s'endort puis que le thread s'exécute, il y a une changement de contexte pour entrer dans ce thread. Avec le changement de contexte pour terminer le thread, tu as donc 2 changements de contexte.

Ensuite, pas de changement de contexte ne signifie pas forcément pas de temps utilisé par le scheduler pour voir s'il y a un changement de contexte à faire et ne pas le faire parce que le thread courant est toujours celui à exécuter.

Et tout cela en ne raisonnant que sur les 2 threads du programme comme s'ils étaient seuls.
__________________
Si Code::Blocks vous dit undefined reference to 'socket@12', cela signifie que vous avez un problème d'édition des liens. Allez dans Projects / Build Options / Linker Settings / Add et renseigner ici les .a qui vont bien. Exemple pour les sockets : C:\Program Files\CodeBlocks\MinGW\lib\libws2_32.a

Pour les adeptes du langage SMS, allez ici et ramenez la traduction française ^^

Pour vos problèmes d'embarqué, utilisez le forum dédié !
Bktero est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/02/2013, 20h51   #14
moktar_bouain
 
Homme
Chercheur en informatique
Inscription : mars 2011
Messages : 19
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Tunisie

Informations professionnelles :
Activité : Chercheur en informatique
Secteur : Enseignement

Informations forums :
Inscription : mars 2011
Messages : 19
Points : -8
Points : -8
Citation:
Envoyé par Bktero Voir le message
Je ne suis pas un spécialiste des pthreads en particulier mais en raisonnant d'un point de vue général, il y a quelque chose de faux dans ton raisonnement. Si dans la fonction main(), tu crées un thread, que le main() s'endort puis que le thread s'exécute, il y a une changement de contexte pour entrer dans ce thread. Avec le changement de contexte pour terminer le thread, tu as donc 2 changements de contexte.
Quand même, 2 changements de contexte ne dépasse pas l'ordre de µs.
Comme je vous dis, la création d'un thread (sans aucune instruction dedans) coute 78 ms !!
moktar_bouain est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/02/2013, 21h07   #15
Joker-eph
Membre expérimenté
 
Inscription : octobre 2004
Messages : 329
Détails du profil
Informations forums :
Inscription : octobre 2004
Messages : 329
Points : 528
Points : 528
La création d'un thread ça implique un appel système et du temps pour créer les structures pour l'OS, c'est pas "gratuit".
Joker-eph est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/02/2013, 21h32   #16
Bktero
Expert Confirmé Sénior
 
Avatar de Bktero
 
Ingénieur systèmes embarqués
Inscription : juin 2009
Messages : 1 708
Détails du profil
Informations personnelles :
Âge : 25
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Ingénieur systèmes embarqués
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juin 2009
Messages : 1 708
Points : 4 188
Points : 4 188
Citation:
Envoyé par moktar_bouain Voir le message
Quand même, 2 changements de contexte ne dépasse pas l'ordre de µs.
Comme je vous dis, la création d'un thread (sans aucune instruction dedans) coute 78 ms !!
Certes, la surcharge parait importante pour juste deux changements de contexte. Je ne répondais qu'à ce que disait transgohan sur le "un seul changement de contexte"

Dans un contexte multi-threadé sur PC, il faut quand même être conscient que des 2 threads ne sont pas tous seuls à se battre pour un coeur de CPU. Tu as d'autres threads, c'est au final assez compliqué de suivre le flow d'exécution. Prenons un cas simple : ton programme et 3 autres threads (T1, T2, T3). Je ne vois pas ce qui empêcherait les 2 scénarios suivants (certes schématiques), d'autres intervenants diront ce qu'ils en pensent :
  1. Ton programme possède uniquement un main()
    - T1 s'exécute
    - Ton programme s'exécute et a assez de temps pour terminer son traitement
    - T2 puis T3 s'exécutent
  2. Ton programme possède un main() (Tm) et un autre thread (Ta)
    - Tm s'exécute et lance Ta
    - T1 s'exécute
    - T2 s'exécute
    - Ta s'exécute et fait tout le traitement
    - T3 s'exécute
    - Tm s'exécute et se termine
Dans ton cas 2, tu n'as pas que le temps de changement entre tes 2 threads mais aussi le temps des éventuels threads qui s'intercalent entre les 2.

Au passage, comment as-tu fait pour arriver à cette valeur ? C'est une moyenne ? C'est une mesure unique ?
__________________
Si Code::Blocks vous dit undefined reference to 'socket@12', cela signifie que vous avez un problème d'édition des liens. Allez dans Projects / Build Options / Linker Settings / Add et renseigner ici les .a qui vont bien. Exemple pour les sockets : C:\Program Files\CodeBlocks\MinGW\lib\libws2_32.a

Pour les adeptes du langage SMS, allez ici et ramenez la traduction française ^^

Pour vos problèmes d'embarqué, utilisez le forum dédié !
Bktero est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/02/2013, 22h02   #17
moktar_bouain
 
Homme
Chercheur en informatique
Inscription : mars 2011
Messages : 19
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Tunisie

Informations professionnelles :
Activité : Chercheur en informatique
Secteur : Enseignement

Informations forums :
Inscription : mars 2011
Messages : 19
Points : -8
Points : -8
Citation:
Envoyé par Joker-eph Voir le message
La création d'un thread ça implique un appel système et du temps pour créer les structures pour l'OS, c'est pas "gratuit".
Oui absolument Joker, j'ai dit pas que ce gratuit mais ça reste de l’ordre de µs

Citation:
Dans ton cas 2, tu n'as pas que le temps de changement entre tes 2 threads mais aussi le temps des éventuels threads qui s'intercalent entre les 2.
J'ai protéger toute la fonction main() par un mutex, pour éviter qu'elle soit interrompu par des autres threads, mais toujours c'est le même résultat.
Citation:
Au passage, comment as-tu fait pour arriver à cette valeur ? C'est une moyenne ? C'est une mesure unique ?
Oui Bktero, c'est une moyenne.
Merci,
Moktar.
moktar_bouain est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/02/2013, 22h09   #18
Bktero
Expert Confirmé Sénior
 
Avatar de Bktero
 
Ingénieur systèmes embarqués
Inscription : juin 2009
Messages : 1 708
Détails du profil
Informations personnelles :
Âge : 25
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Ingénieur systèmes embarqués
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juin 2009
Messages : 1 708
Points : 4 188
Points : 4 188
Citation:
Envoyé par moktar_bouain Voir le message
J'ai protéger toute la fonction main() par un mutex, pour éviter qu'elle soit interrompu par des autres threads, mais toujours c'est le même résultat.
Cela n'empêche pas ton programme d'être préempté par d'autres programmes
__________________
Si Code::Blocks vous dit undefined reference to 'socket@12', cela signifie que vous avez un problème d'édition des liens. Allez dans Projects / Build Options / Linker Settings / Add et renseigner ici les .a qui vont bien. Exemple pour les sockets : C:\Program Files\CodeBlocks\MinGW\lib\libws2_32.a

Pour les adeptes du langage SMS, allez ici et ramenez la traduction française ^^

Pour vos problèmes d'embarqué, utilisez le forum dédié !
Bktero est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/02/2013, 22h14   #19
moktar_bouain
 
Homme
Chercheur en informatique
Inscription : mars 2011
Messages : 19
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Tunisie

Informations professionnelles :
Activité : Chercheur en informatique
Secteur : Enseignement

Informations forums :
Inscription : mars 2011
Messages : 19
Points : -8
Points : -8
Citation:
Envoyé par Bktero Voir le message
Cela n'empêche pas ton programme d'être préempté par d'autres programmes
T'as une méthode pour faire ça?
moktar_bouain est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/02/2013, 23h16   #20
Joker-eph
Membre expérimenté
 
Inscription : octobre 2004
Messages : 329
Détails du profil
Informations forums :
Inscription : octobre 2004
Messages : 329
Points : 528
Points : 528
Citation:
Envoyé par moktar_bouain Voir le message
Oui absolument Joker, j'ai dit pas que ce gratuit mais ça reste de l’ordre de µs
Tu as parlé de changement de contexte, j'ai mentionné "création de thread".

As-tu un exemple minimal qu'on puisse exécuter pour reproduire les 78ms qui paraissent très longues ?
Joker-eph est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 15h59.


 
 
 
 
Partenaires

Hébergement Web