2010-11-01 12 views
2

Combien de boucles infinies un processeur de base 2 peut-il gérer? im me demandais ...Threads du processeur C#

im le développement d'un logiciel qui je dois avoir deux boucles infinte à l'intérieur comme

do{ 
//code 
}while(true); 

je me demandais si ça va être helpfull pour insérer thread.sleep(x) l'intérieur du corps while pour libérer une certaine pression sur le processeur et si cela est vrai combien x devrait être?

+4

0 boucles infinies. Par définition, ils ne finissent jamais. – Oded

+0

je me demande pourquoi quelqu'un a voté pour fermer ça! – Stacker

+0

@Oded, cela ne dépend pas de la définition de "handle"? :) – Constantin

Répondre

2

Cela dépend de ce que vous essayez de faire. Si vous voulez prendre 100% de votre temps CPU, n'insérez aucun Sleep() s. Dans les autres cas, insérez une valeur que vous trouvez appropriée - par exemple, faites 10ms de travail, puis Sleep() pendant 10ms. De cette façon, vous ne supprimerez pas votre CPU et votre système d'exploitation n'aura aucun moyen de déterminer comment planifier les tâches. AFAIK, 10ms est le plus petit intervalle de planification sous Windows. En outre, vous avez l'option Sleep(0) juste pour informer le noyau (dans ce cas, le gestionnaire de thread géré) que vous voulez que les autres prennent en charge le traitement.

+0

et gardez à l'esprit que 10mS signifie" au moins 10mS ", dans la pratique, il sera souvent beaucoup plus – smirkingman

+0

Oui, à droite, il va tourner le contrôle à d'autres threads, et l'obtiendra pas plus tôt que 10ms.Il ya beaucoup d'autres threads qui attendent l'attention du processeur –

0

Vous pouvez également essayer de réduire la priorité de ces threads afin que votre thread graphique (s'il en existe un) et d'autres applications ne gèlent pas.

0

Dans tous les cas, les OS modernes gèrent les threads de manière préventive, cela signifie que si un thread est dans une boucle infinie, il peut être suspendu par le système d'exploitation et exécuter un autre thread/processus sur ce noyau. Cela signifie que vous pouvez avoir n'importe quel nombre de threads avec des boucles infinies et le système d'exploitation prendra en charge la planification. D'autant plus si vous effectuez un Thread.Sleep, cela informe le système d'exploitation que vous souhaitez laisser les autres threads s'en aller.

1

Si vous voulez juste un autre thread à exécuter à un certain moment de l'exécution, puis:

x doit être 0 ou 1.

Mais: 0 ne fera que provoquer un autre thread à exécuter si il est d'égale priorité supérieure. 1 force l'exécution d'un autre thread.

3

Vous devriez pouvoir exécuter environ 2000 boucles, chacune dans son propre thread, avant que l'espace d'adressage de votre processus soit épuisé. Mais voir "If you have to ask, you're probably doing something wrong".

+0

Si c'est une blague, je ne comprends pas :) –

+0

@Daniel Mošmondor, Cette réponse essaie pour ressembler à une vraie réponse tout aussi difficile que la question originale essaie de ressembler à une vraie question :) – Constantin

1

Le sommeil est requis à moins que le corps du thread appelle une fonction de blocage (socket de lecture par exemple) qui fait le sommeil pour vous. Dans tous les autres cas, vous devez appeler le sommeil sinon votre thread utilisera 100% d'un cpu, mangeant des ressources. A propos de la taille de x dépend de ce que le thread traite (à quelle fréquence le traitement sera-t-il nécessaire?).

+0

maintenant ouais c'est ce que je pense mais oui le corps tout à fait est l'ouverture d'une connexion http et l'envoi de données! Mais quand j'essaie mettre thread.sleep (200) affecte la performance beaucoup! – Stacker