Je suis novice dans la gestion de processus / des tâches.
Je voudrais planifier deux tâches.
Supposons, alors comment les programmer, de sorte que je vais obtenir la sortie souhaitée. p> Je veux qu'il fonctionne dans le code :: Blocks (Windows).
Je veux que Fun1 gère 1 min et Fun2 fonctionne toutes les 2 minutes.
Si je peux le faire en deux processus distincts aussi, dites-moi comment puis-je le faire.
Dois-je utiliser un sémaphore, un mutex et tout? p> p>
7 Réponses :
Je pense que vous devriez utiliser un algorithme de planification comme rond-robin ou faire votre propre algorithme.
Ici vous trouverez des algorithmes http://www.centos.org/docs/5/html/5.1/virtual_server_administration/s2-lvs-sched-vsa.html
Vous trouverez des exemples, comment ils sont mis en œuvre et qui pour utiliser. p>
Ce qui suit crée deux threads. Le fil n ° 1 imprime une fois dans une minute et le fil n ° 2 imprime une fois en 2 minutes. Ces threads seront programmés par le planificateur de votre système d'exploitation. À Linux, nous avons CFS pour effectuer la planification. Et pour obtenir un aperçu de la planification, lisez Ce
$ gcc t.c -lpthread $ ./a.out Creating fun1 thread Creating fun2 thread 1 minute 2 minute 1 minute 1 minute ^C $
Je pense que vous avez fait une bonne aide. Cela m'a vraiment aidé à comprendre UNIX OS. Mais j'ai toujours une autre question, sans créer de fil, pouvons-nous faire la même chose dans la norme C?
@ user1105805 Je suis content! Merci! :)
@ user1105805 Pour créer des threads, vous avez besoin d'une bibliothèque de threads comme pthread code> qui fournit une infrastructure de base pour créer, gérer, surveiller et supprimer des threads.
C11 (la nouvelle version de C qui a été finalisée et publiée il y a environ 2 semaines) a un minimum de support de fil dans
@Rasmiranjannayak, j'espère que vous savez que Windows et Standard C ne sont pas exactement la même chose. Votre question est marquée Windows.
Eh bien, il serait préférable que vous puissiez spécifier votre système d'exploitation (ou l'exigence de crossplatformness)
YO peut écrire: p>
pour le multitâche chacun de ci-dessus peut utiliser: p>
examiner. POSIX OS compatible (comme Linux), à l'aide de processus forts> p> autres cas: strong> p>
Mon exemple est donc un peu non négligeant pour vous. Vous voudrez peut-être ajouter une balise «Windows» à votre question. Recherchez des exemples d'utilisation de Createthread (), il y a beaucoup dans le réseau.
Dormir (60) est mauvais: l'exécution de Printf prend un certain temps, vous pouvez donc avoir moins de 60 impressions par minute!
Bien mans .... Il y a encore plus - ce programme ne s'arrête jamais, il ne gère pas SIGNAS, ne renvoie pas le code d'erreur si échoue, etc. En raison de tout cela, il est appelé "exemple". Et il démontre une fourchette ().
La manière la plus simple, bien que non précise, de cela est d'utiliser le point de veille POSIX SLEEP () CODE> Fonction à l'intérieur d'une boucle infinie.
while(1)
{
fun1();
sleep(60);
fun1();
fun2();
sleep(60);
}
Étant donné que "Windows" a été mentionné dans la question, le Win32 Sleep (60000) Code> serait requis plutôt que POSIX
SLEEP (60) CODE>
J'espère que Windows inclut l'interface POSIX, avec un minuscule () code>
J'espère que tout ce que vous aimez; Ce n'est pas le cas. Et il est toujours utile de répondre à la question dans les termes demandés; Surtout pour un novice qui peut ne pas comprendre que les environnements cibles ont différentes bibliothèques et API. Il y a (Solutions partielles) [ msdn.microsoft.com/en-us/ Bibliothèque / Y23KC048.aspx] , ou vous pouvez utiliser Cygwin, mais dans ce cas, il s'agit d'un marteau de luge pour craquer une noix, en particulier lorsque la fonction de sommeil Win32 ayant une résolution milliseconde est en fait plus flexible. sommeil non signé (non signé s) {sommeil (S / 1000); retour 0; } code> si vous insistez vraiment ;-)
éditer: em> cela est uplifié, je voudrais donc ajouter une clarification pour la postérité. Ce n'est pas un bon moyen de résoudre ce problème - vous les jamais em> veux faire cela à la main. Les threads de l'utilisateur coopératif sont agréables et peuvent être utilisés pour mettre en œuvre des choses intelligentes comme les coroutines, mais si vous voulez faire cela, vous devez utiliser une bibliothèque comme libcoroutine qui gère les bits velus pour vous. Cependant, alors que ce n'est pas une solution pratique, cela présente toujours une idée intéressante et constitue un exemple intéressant de planification et des limites de Pure C99. C'est une mauvaise réponse. Cependant, il est indépendant de la plate-forme, et de plus, utilise uniquement des fonctions définies dans la norme C99. P> d'autre part, il portait la CPU (il n'y a pas de La technique est nommée files d'utilisateurs coopératives, également appelées fibres. Comme je l'ai mentionné, je l'ai mis en œuvre à l'aide de Ceci est le code: p> et c'est la sortie que je reçois: p> Sleep code> Fonctions en C99, nous devons donc bien attendre), utilise ce que je peux appeler de la magie pour réserver de la place sur la pile et les abus complètement
SetJMP code>. Il utilise même des variables globales! Et pourtant, cela fonctionne. P>
SETJMP code> et
longJMP code>. Le
context_switch Code> fait une planification simple Round Robin. P>
Merci. L'idée est très intéressante. Je n'ai pas assez de temps pour lire et vérifier, le fera plus tard. :)
@ CHA0SITE: YA C'est une idée assez intéressante. Merci
Il illustre SetJMP () très i> joliment, je viens avait i> upvote. Pardon.
upvote à cause de l'awesomeness ... ne savait pas que cela est possible dans Pure C99 sans Aide Libs / OS ... Bien que je n'utilise jamais SetJMP ... cela peut expliquer pourquoi.
Votre exemple est trivial et peut être programmé sans recourir à aucun système d'exploitation fourni ou même des services de synchronisation du système d'exploitation, cependant en général (pour les exigences non triviales) sous Windows, vous utiliseriez la multi-threading et permettriez au système d'exploitation d'effectuer la Planification. voir créer des threads pour un traitement plus complet du filetage dans Win32. Sachez que le .NET Framework fournit également une interface de classe plus simple à la filetage. P> p> Main () Code> est déjà un thread, vous n'avez donc besoin que d'en créer un autre. Dans sa forme la plus simple:
Vous avez raison mais je voulais écrire le code dans Standard C. I Utilisateur Code :: Blocks IDE. Il ne supporte pas le sommeil () ou le retard ().
@Rasmi Ranjan Nayak: Cela ne semble pas correct. Dormir () est une fonction d'API Windows, exactement comme Createthread. Il ne doit en aucun cas être connecté à l'IDE. D'autre part, si vous n'écrivez pas à l'application native Win32, cela signifie que vous utilisez une bibliothèque (WxWidgets?), Examinez donc la documentation pour votre sommeil et votre support.
@Limar: Peut-être que vous avez raison. Mais quand j'ai essayé cela m'a donné une erreur. Même vous pouvez essayer la même chose dans le code :: Blocks. écrire un programme simple. 'Main () {Dormir (1000); printf ("sommeil exécuté"); } '
@Rasmi Ranjan Nayak: 1) Dormir () et dormir () sont différents! L'affaire lettre importe en c.; 2) Choisissez Droite de type de projet dans Code :: Blocs - Décidez s'il s'agira de Win32 ou de GTK + ou SMTH. 3) Incluez tous les en-têtes nécessaires à vos fichiers C - suivez simplement un didacticiel si vous êtes nouveau à C.
Sleep () Code> n'est pas ce que j'ai écrit.
Sommeil () Code> Est ce que j'ai dit! Copiez et collez le code et construisez-le. Je l'ai testé en VC ++, mais il est entièrement standard C code et utilise l'API Win32 qui devrait être disponible pour n'importe quelle boîte à outils Win32. Le fait que vous utilisiez le code :: Les blocs ne sont pas pertinents, ce que la chaîne de sous-outils sous-jacente à l'outil utilise (il est configurable à tout). S'il utilise Mingw / GCC, ce code fonctionnera comme affiché.
Cette approche concerne les opérations SETJMP et LONGJMP à l'aide de la commande Sleep.
Créer des threads séparés avec une activation de la minuterie se vient à mon esprit. Vous ne pouvez pas le faire dans Standard C sans l'aide du système d'exploitation
Alors, ce que vous voulez, c'est pour que Fun1 fonctionne chaque minute et Fun2 à courir toutes les 2 minutes? Et avez-vous voulu dire pour eux d'être des fonctions ou souhaitez-vous des processus distincts, comme cela implique votre question? Enfin, quel système d'exploitation?
Veuillez lire Ceci pour obtenir un aperçu de ce qui est planifiant?
Vous avez marqué ce
[système d'exploitation] code>, mais oublié de nous dire quel système d'exploitation que vous utilisez. L'étiquette était-elle destinée à transmettre que vous essayez d'écrire un système d'exploitation de votre propre i> en C?
@Donotalo, eh bien ... vous peut i> le faire dans Standard C, en utilisant la coopérative multitththreading (c'est-à-dire une abusive SetJMP et LongJMP), mais ce n'est pas ce que veut l'astucheuse.
@ CHA0SITE: multithreading en C? comment faire ça? Même si vous utilisez SETJMP et LONGJMP? n'importe quel lien?
@Donotalo: Découvrez Article Wikipedia sur SetJMP . Notez que l'exemple fonctionne pour 2 threads, mais cela peut être étendu à N threads avec une pensée. Si vous voulez que je puisse élaborer, ouvrez une question = D
@Donotalo: J'ai utilisé les minuteries (délai (1), délai (2)). Mais il ne fonctionne toujours pas
@ user1105805: probablement votre paramètre code> de retard code> est du temps en millisecondes.
@Donotalo: Désolé, j'ai mis le retard (1 min) et le délai (2 min). 1 min = 60 sec, 1 min de retard est 100 * 60
Aucun sémaphores / mutiles dont vous n'avez besoin pendant que vos discussions n'accédaient pas à une ressource commune (variable commune / fichier / socket / zone de dessin, etc.)
@Donotalo: J'ai ajouté le
SETJMP CODE> Abuse comme réponse, car l'asker insiste sur Standard C. Vous voudrez peut-être jeter un coup d'œil =)
@ CHA0SITE: Merci beaucoup. Bonne aide de votre part. Je vous souhaite tout le meilleur.
@Rasmi: Avez-vous voulu dire code :: blocks i> plutôt que bloc de code i>, ce qui pourrait signifier quelque chose de tout à fait différent? Pourquoi ce marquage est-il "intégré"?
@Clifford: Code :: Blocks IDE. La raison pour laquelle il est étiqueté est incorporé car dans le système intégré, nous faisons la gestion des processus.
@Rasmi: Eh bien, la réponse exacte sera différente pour un système intégré, à moins que vous n'ayez utilisé Windows intégré ou Wince. Les principes s'appliquent, mais le système d'exploitation qui fournit la planification est que Likeley est différent et d'avoir une API différente, ou vous n'avez peut-être pas du tout. Le point sur le code :: Blocks était un indice que vous devriez éditer la question à clarifier - c'est un nom de produit. Comme il arrive que l'IDE utilisé est en grande partie sans importance dans tous les cas, le code s'exécutera sur Win32, Code :: Blocks est un environnement de développement et non un environnement d'exécution, voire un compilateur.
@Clifford: Merci de me faire comprendre ...
@Tall: Merci à tous, qui m'ont aidé. Tous mes vœux