Thread + C
ahmed.ben.salem
Messages postés
87
Statut
Membre
-
Char Snipeur Messages postés 10112 Statut Contributeur -
Char Snipeur Messages postés 10112 Statut Contributeur -
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.
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:
- Thread + C
- Compte thread - Accueil - Réseaux sociaux
- Thread instagram c'est quoi - Accueil - Guide réseaux sociaux
- Fausse appli Threads : déjà une imitation frelatée et dangereuse ! - Accueil - Guide arnaque
- Thread - Guide
- Thread application - Télécharger - Réseaux sociaux
30 réponses
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 :
Est ce que je peut utilser sa ou nn?
Merci d'avance.
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.
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)
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)
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 :
Donc, t'en pense qoi?
Merci d'avance.
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.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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 :
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.
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.
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;
}
#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;
}
Re;
Et tu pense quoi sur ce code ;)
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.
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.