2009-12-30 3 views
0

J'ai deux threads dans mon application. Est-il possible d'exécuter les deux threads simultanément sans dormir aucun thread?Threads parallèles dans C

+1

S'il vous plaît faites votre question un peu plus spécifique, ou au moins inclure quelques extraits de code de ce que vous essayez de faire. – chakrit

+0

oui, si vous avez deux cpus physiques –

+0

Cela ressemble à une question de test? Devoirs? –

Répondre

4

Comme d'autres l'ont mentionné, avec plusieurs cœurs, c'est possible, mais cela dépend de la façon dont l'OS décide de distribuer les threads. Vous n'avez aucun contrôle, que j'ai vu, en dictant où chaque thread est exécuté.

Pour un très bon tutoriel, avec de bonnes explications et des images, vous pouvez regarder cette page, avec du code sur la façon de faire du multi-threading en utilisant la bibliothèque POSIX.

http://www.pathcom.com/~vadco/parallel.html

La tranche de temps de sommeil est difficile de voir, de sorte que votre meilleur pari est de le tester, par exemple, ont vos deux fils commencent à compter chaque milliseconde, et voir si les deux sont identiques. Si ce n'est pas le cas, au moins l'un va dormir par le CPU. Il est fort probable que les deux vont s'endormir à un moment donné, le test consiste à voir quelle différence il y a entre les deux threads.

Une fois qu'un thread bloque, soit en attente d'envoi de données, soit en attente de réception, il sera mis en veille afin que d'autres threads puissent s'exécuter, de sorte que le système d'exploitation puisse continuer à fonctionner correctement.

+0

Sur certaines plates-formes, vous pouvez contrôler l'exécution de chaque thread à l'aide d'une API affinity, telle que SetThreadAffinityMask() sous Windows et sched_setaffinity() sous Linux. – bk1e

+0

@ bk1e - Merci, je n'ai jamais entendu parler de cela, mais il semble bon pour les instances où je veux remplacer le système d'exploitation sur la planification. –

+0

@ bkl1e - from MSDN: La définition d'un masque d'affinité pour un processus ou un thread peut entraîner une réduction de la durée du processeur pour les threads, car le système ne peut pas exécuter les threads sur certains processeurs. Dans la plupart des cas, il est préférable de laisser le système sélectionner un processeur disponible. –

0

Oui, si vous avez plusieurs processeurs ou processeurs multicœurs. Un thread va fonctionner dans un noyau.

+0

Les threads ne sont pas garantis pour fonctionner sur un autre processeur ou noyau, même si vous en avez plus d'un. –

+0

Cela peut être vrai, mais il est garanti que sur un seul ordinateur principal, un seul thread sera exécuté (en ignorant les hyperthreads - ceux-ci en font au moins une machine pseudo-multicœur). Avec une machine multicœur, il est possible que les threads tournent simultanément - mais pas de garantie. –

3

C n'a pas, lui-même, de moyen de faire du code multithread.

Cependant, les bibliothèques qui a Posix vous permettent de travailler avec des fils en C.

Un bon article sur ce sujet est How to write multi-threaded software in C and C++.

+0

La plupart du temps OS fournit également des bibliothèques pour le multi-threading. Dans C sur windows, vous pouvez utiliser _beginthreadex() pour créer des threads dans votre application ou même CreateThread. Mais _beginthreadex() est préféré. –

9

Vous pouvez exécuter les threads parallèlement dans votre application, en particulier s'ils n'attendent pas les uns les autres pour certaines entrées ou conditions. Par exemple: un thread peut être en train d'analyser un fichier et d'autres peuvent jouer une chanson dans votre application.

Généralement, OS prend en charge le découpage du temps de filetage. Ainsi, au niveau de l'application, il semblerait que ces threads soient parallèles, mais le système d'exploitation fait le découpage temporel en donnant à chaque thread un certain temps d'exécution. Avec les processeurs/noyaux multicœurs, il est possible d'exécuter les threads parallèlement en temps réel, mais le système d'exploitation décide des threads à exécuter, sauf si vous codez spécifiquement au niveau inférieur pour garantir les threads que vous souhaitez exécuter en parallèle.

+0

+1 pour mentionner plusieurs cœurs. –

Questions connexes