Thread + C

Fermé
ahmed.ben.salem Messages postés 86 Date d'inscription lundi 31 mars 2008 Statut Membre Dernière intervention 28 avril 2009 - 21 juil. 2008 à 10:34
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 - 12 août 2008 à 15:02
Bonjour,
Tout d'abord j'explique c'est que je veux faire:
Un tread qui se lance après un temps, et qui reste en exécution en parallèle avec l'exécution
de mon programme principale.

Exemple :
ma fonction() {
........
if(test) {
réveillé thread;
}

reste du code (code B)
}


Je veux ici que le code B reste en exécution en parallèle avec l'exécution de mon tread.

Quelqu'un peut m'aider, pour la création du tread et comment je peut réaliser cet exemple.
(développement en C sous Unix)
Merci d'avance.

30 réponses

ahmed.ben.salem Messages postés 86 Date d'inscription lundi 31 mars 2008 Statut Membre Dernière intervention 28 avril 2009 4
21 juil. 2008 à 11:40
slt;
quelqu'un peut m'aider les amis :(
Merci d'avance.
0
BoBoXx Messages postés 260 Date d'inscription mardi 24 juin 2008 Statut Membre Dernière intervention 3 août 2008 34
21 juil. 2008 à 14:13
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
21 juil. 2008 à 14:35
moi, j'utilise la biblothèque pthread pour les thread.
il suffit de définir le thread comme étant séparer et joignable lors de ça création.
Comme tu es sous Unix, utilise les commandes 'man' :
man pthread_create
et ensuite, tu as des liens à l'intérieur
0
ahmed.ben.salem Messages postés 86 Date d'inscription lundi 31 mars 2008 Statut Membre Dernière intervention 28 avril 2009 4
25 juil. 2008 à 10:31
Bonjour;
Merci pour l'information, de toute façon moi c que je cherche et que l'algorithme qui fait appel a un thread termine l'exécution des instructions qui sont après l'appel :
Exemple :

fonction( ) {

.......

appel_threadA

Reste des instructions

}
Içi je veux que ma fonction appel le ThreadA et en meme temps je veux l'exécution des reste des instructions

Merci d'avance.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
25 juil. 2008 à 11:44
?
0
Sri Lumpa Messages postés 177 Date d'inscription mercredi 14 novembre 2007 Statut Membre Dernière intervention 1 juin 2010 68
25 juil. 2008 à 13:32
Be c'est justement le principe... Quand tu crées un thread, il va exécuter une fonction ou des instructions en parallèle alors que la suite du code continue... Le pthread_create va créer un "processus" (je vais me faire tuer en disant ça.... ^^) qui va s'exécuter parallèlement au reste du code de ton programme principal...

Après, comme le dit Char Sniper, man pthread_create et man pthread sont tes amis
0
ahmed.ben.salem Messages postés 86 Date d'inscription lundi 31 mars 2008 Statut Membre Dernière intervention 28 avril 2009 4
29 juil. 2008 à 13:31
Bonjour;

Je m'excuse pour se retard, voila les amis un exemple qui repond a mon besoin, içi je veux l'affichage suivant :

Bonjour Tout le monde.
Mais cet exemple il m'affiche : Tout le monde Bonjour. :(:(
qq peut m'aider.

////////////////////////////////////////
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

volatile int ok = 0;

void* affichage () {
while (ok != 1) { }
printf(" Tout le monde \n ");
return NULL;
}

int main (void) {
pthread_t filsA;

if (pthread_create(&filsA, NULL, affichage, "AA")) {
perror("pthread_create");
exit(EXIT_FAILURE);
}
if (pthread_join(filsA, NULL))
perror("pthread_join");

printf(" \n Bonjour ");
ok = 1;
return 0;
}

///////////////////////////////////

Merci d'avance.
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
29 juil. 2008 à 14:37
ba oui, logique !
tu attend que ton thread se finisse (pthread_join) avant de dire bonjour.
Met le pthread_join juste avant le return, ça a des chances de fonctionner.
Mais il faut savoir que l'exécution est alors un peu aléatoire dans ce genre de chose ; faire deux choses en parallèle ne signifie pas qu'elle avancent à la même vitesse ni dans un ordre bien établie. ça intriduit un peu d'aléatoire dans le programme.
0
ahmed.ben.salem Messages postés 86 Date d'inscription lundi 31 mars 2008 Statut Membre Dernière intervention 28 avril 2009 4
29 juil. 2008 à 14:44
re;
donc qu'est ce que je doit faire, pour qu'il m'affiche "Bonjour Tout le monde".
Merci
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
29 juil. 2008 à 14:49
printf("Bonjour Tout le monde");
y a pas à tortiller du cul pour aller droit, si tu veux une exécution séquentielle fait ça en séquentielle : laisse tomber les thread.
0
ahmed.ben.salem Messages postés 86 Date d'inscription lundi 31 mars 2008 Statut Membre Dernière intervention 28 avril 2009 4
29 juil. 2008 à 14:58
Re;
mais l'alogo que j'ai le donné c'est juste un exemple. Car je veux utiliser mon thread dans un truc ou je veux faire un réception des donnée ( Via HTTP protocole ) et le temps ou je veux faire la réception je veux en même temps faire des analyse de données que je les reçu.

Merci de m'avoir aidez (même de me donnée une solution pour l'algo se dessus).
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
29 juil. 2008 à 15:28
ben, à ce moment là, il faut imbriquer des boucles.
Tu lance ton thread de reception, chaque fois qu'il reçoit une donnée il incrémente une variable globale, et ensuite tu fait une boucle while qui détecte quand cette variable change et dès qu'elle change (nouvelles données dispo) tu fait un traitement, sinon tu attends un peu. L'algo serait :
Lancer le thread de reception
Tant que la reception n'est pas fini et que tout les données ne sont pas traitées
si Il y a des données non traité alors :
traité les données non traité
effacer les données traitées de la liste de traitement.
sinon
attendre un certain temps de nouvelles données (x ms)
fin "si"
fin "tant que"
0
ahmed.ben.salem Messages postés 86 Date d'inscription lundi 31 mars 2008 Statut Membre Dernière intervention 28 avril 2009 4
29 juil. 2008 à 15:49
Re;
Oui merci pour la réponse, mais moi j'ai l'olgo, et mon problème comment je peut faire sa avec le thread, c'est le fait de répondre a mon exemple d'affichage c'est exactement sa ( Afficher : " Bonjour Tout le monde") au lieu de "Tout le monde bonjour " :(:(:( )
Merci d'avance.
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
29 juil. 2008 à 15:58
Arg !!!
Non, ça n'as rien à voir !! Là tu pose un problème de séquence avec printf, tu veux que "bonjour" arrive avant "tout le monde".
avec ton truc HTTP, à chaque fois que tu reçois un nouveau paquet de donnée, tu le met en pile dans une variable, puis tu incrémente une autre variable (ok par exemple)
ensuite dans ta boucle tant que (while) tu utilise une autre variable, si cette variable es inférieur à "ok" alors tu traite un paquet de donné puis tu incrémentes la variable du tant que.
Essai ça, peut être ça donnera ce que tu veux :
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

int ok = 0;

void* affichage () {
while (ok != 1) { sleep(100); }// faire un while complétement vide va te bouffer tout ton CPU, et c'est pas le but
printf(" Tout le monde \n ");
return NULL;
}

int main (void) {
pthread_t filsA;

if (pthread_create(&filsA, NULL, affichage, "AA")) {
perror("pthread_create");
exit(EXIT_FAILURE);
}

printf(" \n Bonjour ");
ok = 1;
if (pthread_join(filsA, NULL))// là tu attends la fin d'exécution du thread avant de sortir de la fonction main
perror("pthread_join");
return 0;
} 
0
ahmed.ben.salem Messages postés 86 Date d'inscription lundi 31 mars 2008 Statut Membre Dernière intervention 28 avril 2009 4
29 juil. 2008 à 16:11
Re;
Bon je t'explique mieux :

Fonction_thread() {
adr :
 si non_Fin
    Tanq'il y a des données reçus;
        faire des traitements sur Mem_reçu ;
    Fintantque
    attentd qq seconde et goto adr
 finsi
}

Callback_reception() {

       Reception des données
       si la premiere_foi
            si taille de données est attein faire appel au thread
            finsi 
      finsi
}

fonc_principal() {

        faire ds appel cyclique a la fonction callback;
}



Pour la fonction callback tout est bon et tout va bien, je reçois les données mais la je veux faire d'autre instruction en parallèle lors du réception des données qui est l'utilité de thread ( en fait l'utilité du thread est de le Streaming : injection des données son dans le canal Client :) ).

Merci d'avance.
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
29 juil. 2008 à 16:56
je pense que ton algo n'est pas terrible.
0
ahmed.ben.salem Messages postés 86 Date d'inscription lundi 31 mars 2008 Statut Membre Dernière intervention 28 avril 2009 4
29 juil. 2008 à 17:08
Re;
De ma part si c'est pas terrible prk chui sur le Forum, donc je trouve pas une solution (pour faire l'exécution de deux programmes en même temps) STP si ta une solution pour faire sa je t'attend et sa me fait beaucoup plaisir (mem juste pour l'algo de "Bonjour Tout le monde".
Merci
:(:(
0
Sri Lumpa Messages postés 177 Date d'inscription mercredi 14 novembre 2007 Statut Membre Dernière intervention 1 juin 2010 68
29 juil. 2008 à 18:48
Si tu veux bloquer l'exécution d'un thread tout en attendant un événement et reprendre l'exécution dès qu'un événement particulier arrive, tu peux utiliser des sémaphores. Je ne me rappelle plus trop la syntaxe mais en gros ça permet de signaler à un programme de se mettre en attente ou de continuer son exécution.
0
ahmed.ben.salem Messages postés 86 Date d'inscription lundi 31 mars 2008 Statut Membre Dernière intervention 28 avril 2009 4
29 juil. 2008 à 19:09
Re;
En fait c'est une chose comme le sémaphore, je veux créé un thread qui s'exécute après un temps, et la dans mon algorithme principale je termine l'exécution de mes instructions, donc mon problème c'est :

mon_thread()
{
}

ma_function()
........
appel mon_thread
... Reste des instruction
}


je veux dans cet exemple faire appel a un mon thread et la fonction "ma_fuction()" termine l'exécution des reste des instructions.
Merci d'avance.
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
30 juil. 2008 à 09:05
As tu essayé ma correction de "bonjour tout le monde" ?
Dans le message 12, je t'ai donné un exemple d'algo.
0