Thread + C

ahmed.ben.salem Messages postés 86 Date d'inscription   Statut Membre Dernière intervention   -  
Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   -
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.
A voir également:

30 réponses

ahmed.ben.salem Messages postés 86 Date d'inscription   Statut Membre Dernière intervention   4
 
Bonjour;
Bon, a ce moment j'ai utilisé deux thread pour réaliser cette tache, disant j'ai utilisé la sémaphore ( l'un bloc l'autre, après de déblocage l'exécution sera en // ) :)
Donc maintenant mon problème est ce que je peut utiliser une fonction qui à des variables et que je l'affecte à un thread.

Exempl :
Ma_fonction(char *par1, int x)
{ ...... }

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

Est ce que je peut utilser sa ou nn?
Merci d'avance.
0
Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
oui et non, il faut que la fonction passer au thread soit de type void*f(void*)
donc
void* Ma_fonction(void* A){
char* par1=(char*)A
int x=*((int*)((char*)A+1);
...
}
ensuite, tu crée un pointeur, ou une structure:
struct A{char* p1;int x;}
que tu passe en paramètre de pthread_create :
pthread_create(&filsA, NULL, Ma_fonction, &A)
0
ahmed.ben.salem Messages postés 86 Date d'inscription   Statut Membre Dernière intervention   4
 
Re;
Merci, en fait j'ai créé une autre fonction qui prend pas ds paramétrés. Mais le prb d'affichage "Bonjour Tout le monde" sa existe encore, j'ai pensé que sa marché mais dommage, :( .
On revient donc a notre première discussion :)

Autre explication :
Ma_fonction_thread() {
   injection de données dans le canal Client ( Domaine VoIP)
}

Ma_fonc_telechar() {

   lancer le thread lorsqe la taille du buffer > debut_injection
   et terminer la reception de données ( allocation dans le buffer)
}

Donc, t'en pense qoi?
Merci d'avance.
0
Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
J'en pense que tu a à ce momnet là un problème de synchronisation.
0

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

Posez votre question
ahmed.ben.salem Messages postés 86 Date d'inscription   Statut Membre Dernière intervention   4
 
Re;
Aidez moi svp les amis :(
0
ahmed.ben.salem Messages postés 86 Date d'inscription   Statut Membre Dernière intervention   4
 
Re bonjour;
Les q peut m'aider, j'explique une autre fois le prb, c'est que moi je développe avec C et je voudrai utiliser la notion du thread dans la développement, la question c'est que : comment je peut faire fonctionné mon thread et en même temps ma fonction termine l'exécution du reste du programme. j'explique avec un exemple :
Mafonction() {
 ...... des instruction 

Appel d thread

Reste des instructions 
}

Ici je veux que lorsque je fait appel à mon thread, ma fonction "Mafonction" termine l'exécution du reste d code.
Rq : J'ai créé une variable globale pour faire arrêter mon thread.
SVP les amis aidez moi.
0
ahmed.ben.salem Messages postés 86 Date d'inscription   Statut Membre Dernière intervention   4
 
Bonjour;
Aidez SVP les amis.
:(
0
Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
un code qui fonctionne :
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

volatile int ok = 0;

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

int main (void) {
pthread_t filsA;

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

printf(" \n Bonjour ");
ok = 1;
if (pthread_join(filsA, NULL))
perror("pthread_join");
return 0;
}
0
ahmed.ben.salem Messages postés 86 Date d'inscription   Statut Membre Dernière intervention   4
 
Re;
Et tu pense quoi sur ce code ;)


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

void* maFonctionA()
{
    // Affiche 50 fois 1
        int i = 0;
        for(i=0 ; i<50 ; i++)
        printf("1\n");
}
void* maFonctionB()
{
        // Affiche 50 fois 2
        int i = 0;
        for(i=0 ; i<50 ; i++)
        printf("2\n");
}

int ff()
{
        pthread_t threadA, threadB; // On créun thread
        int j = 0;
        pthread_create (&threadA, NULL, maFonctionA, NULL); // Permet d'exéter le fonction maFonction en parallè
        pthread_create (&threadB, NULL, maFonctionB, NULL);
        // Attend la fin tu thread cré
        pthread_join(threadA, NULL);
        pthread_join(threadB, NULL);
        return 0;
}

int main() {

        int x = ff();
        return x;
}



Le résultat donné est le suivant :

Code : Console
1111111111222222222222222222222222222222222111111111111111111111111111111111112222222222222222211111

Mais pourquoi les nombres s'affichent par paquets ? Si les fonctions se lançaient en parallèle, je devrais obtenir 12121212...

Si les nombres s'affichent par paquet, c'est à cause de votre OS.
En effet, la fonction principale (main) et la fonction exécuté par le thread créé (maFonction) ne se lance pas tout à fait en parallèle car votre OS va attribuer un temps d'exécution pour chaque thread.
Votre OS va, par exemple, exécuter le code du thread n°1 de votre processus pendant 8 ms, puis va exécuter le code du thread n°2 du même processus aussi pendant 8 ms, etc. ...
Il en est de même pour le fonctionnement des processus ;) .
Ainsi, comme chaque thread est exécuté à tour de rôle pendant un temps très court, vous avez l'impression qu'ils se déroulent en parallèle.
0
Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
heu ?...
0