2017-04-21 2 views
0

Je dois écrire un programme, essentiellement un jeu - en bref, il y a des soldats qui collectent des ressources, déchargent des ressources dans la base, s'entraînent et d'autres choses. J'ai lu des articles sur les discussions et comment les utiliser pour un marathon de 6-7 heures, mais je pense avoir besoin d'aide. Donc, je peux écrire un programme très simple avec des threads qui utilisent une fonction, disons une fonction qui imprime "bonjour je suis le numéro de fil: N". Mais, ce que je n'obtiens pas - si par exemple nous recherchons ce programme facile avec la commande print, nous donnons à chaque thread un pointeur vers la fonction et tout est amusant et amusant. Mais, dans mon cas, je dois faire plusieurs fonctions et ce que je ne comprends pas est comment puis-je faire toutes les discussions à travers toutes les différentes fonctions? L'idée principale est d'utiliser mutex et condvars, mais comme je peux donner à chaque thread un seul pointeur de fonction dans ses arguments, je ne vois pas comment je peux accomplir cette tâche, puisque j'ai comme 3-4 fonctions. Je ne pense pas que la création d'un fil pour chaque fonction résout le problème, voici pourquoi:Discussions en programmation C (linux)

Game begins! 
Worker 1 is searching 
Worker 1 is transporting 
Worker 1 unloaded resources to Base station 
Worker 2 is searching 
Worker 2 is transporting 
Worker 2 unloaded resources to Base stationW 
Operation not supported 
Worker 3 is searching 
Worker 3 is transporting 
Worker 3 unloaded resources to Base station 
..... 
b 
Not enough resources 
Worker 4 is searching 
Worker 4 is transporting 
Worker 4 unloaded resources to Base station 
... 
b 
Worker 3 is constructing new building barracks 
Worker 2 is searching 
Worker 2 is transporting 
Worker 2 unloaded resources to Base station 
.... 
Worker 3 completed new building barracks 
w 
Warrior is being trained 
Worker 3 is searching 
Warrior is ready for duty 

cela doit être la sortie du jeu. Ne pas déranger W et B - juste quelques opérations qui doivent remplir certaines conditions pour fonctionner. Donc ma question est - devrais-je utiliser un fil pour chaque fonction? Je ne veux pas que vous résolviez mon problème, je serai juste très heureux de m'éclairer comment je devrais aborder ceci, merci beaucoup!

+0

La modélisation d'objets tels que les soldats en tant que threads est une très mauvaise idée. Repensez votre conception. – nwp

+0

Ceci est ma tâche, je dois le faire de cette façon. Ce n'est pas mon idée. –

Répondre

0

Chaque thread a une seule fonction où démarre en cours d'exécution, mais cette fonction peut en appeler d'autres. C'est analogue à la fonction main() où le thread principal de votre programme démarre. À partir de votre exemple de sortie, il semble que vous souhaiterez que chaque thread exécute une boucle qui passe par une séquence d'étapes (recherche, transport, etc.) à plusieurs reprises. Chaque étape peut impliquer l'appel d'une ou de plusieurs autres fonctions. Et ces fonctions peuvent faire des choses comme bloquer sur une variable de condition pour attendre la disponibilité des ressources.

Sur une remarque connexe: en plus du pointeur de fonction, pthread_create vous permet seulement de transmettre un seul pointeur arg en tant que données au thread. En supposant que votre thread a besoin de plus d'un pointeur unique d'informations, vous devez créer un struct pour contenir toutes les informations dont le thread a besoin, et lui passer un pointeur.

+0

Donc, fondamentalement, vous dites créer un thread pour chaque fonction, boucle jusqu'à ce qu'une condition est remplie et retourne une valeur? Cela me donne envie de demander, si par exemple j'ai une fonction gatherResources et disons que je reçois 5 ressources, comment puis-je stocker cette variable globale et/ou la renvoyer dans la main? pour autant que je sache utiliser pthread_ext (N) - où N est disons 5 dans notre cas, puis pthread_join principal (threadName, [storeNhere])? Pourriez-vous m'expliquer cela? –

+0

Non, je dis créer un fil pour chaque soldat, et lui faire faire toutes les choses qu'un soldat doit faire - ce qui implique * l'appel * des fonctions comme 'gatherResources' et' deliverResources', et implique probablement une boucle puisque la soudure devrait rassembler plus de ressources après avoir livré le premier lot. – Wyzard

+0

Et si je devais créer des soldats? Devrais-je simplement écrire une fonction pour soldierCreation, utiliser un thread pour cela et incrémenter une variable globale chaque fois qu'un soldat est créé? –