Linux Home
Linux Home
Linux Home
#include<pthread.h>
#define N 4
int j , row;
pthread_t tid = pthread_self();
row =(int)arg;
printf("Thread %d [%lu] computes sum of row %d \n",row,tid,row);
for(j=0 ; j<N ;j++)
sum[row] += A[row][j];
printf("Threads %d [%lu] done: sum[%d] =%d \n", row , tid , row , sum[row]);
pthread_exit((void*)0);
}
printf("%4d" ,A[i][j]);
printf("\n");
}
printf("Main: create %d threads\n",N);
for(i=0;i<N;i++){
pthread_create(&thread[i],NULL,func,(void *)i);
}
printf("Main: try to join with threads\n");
for( i=0 ; i<N ; i++){
pthread_join(thread[i],&status);
printf("Main: joined with %d [%lu] : status =%d \n", i,thread[i],(int)status);
}
printf("Main : compute and print total sum: ");
for(i=0;i<N;i++)
total += sum[i];
printf("tatal = %d\n",total);
pthread_exit(NULL);
------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------
Voici un exemple de programme en C qui crée autant de threads qu'il y a de processeurs sur la
machine où il est exécuté :
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
int main(void)
{
int nb_processors = sysconf(_SC_NPROCESSORS_ONLN); // Nombre de processeurs
printf("Il y a %d processeurs sur cette machine\n", nb_processors);
return 0;
}
Le programme utilise la fonction sysconf pour obtenir le nombre de processeurs sur la machine,
puis crée autant de threads à l'aide de la fonction pthread_create. Chaque thread exécute la
fonction thread_function, qui affiche simplement un message indiquant son numéro de
thread. Enfin, le programme attend la fin de chaque thread à l'aide de la fonction pthread_join.
Il est important de noter que chaque thread partage les mêmes ressources (variables globales,
fichiers, etc.) que le thread principal. Il faut donc être vigilant lorsque plusieurs threads accèdent
simultanément à ces ressources et mettre en place des mécanismes de synchronisation si nécessaire.
-
=======================================================================
ecrire un programme en c qui demarre autant de threads qu'il y a de processeurs .chaque thread se
place sur un processeurs distinct
Il est impossible de garantir que chaque thread sera exécuté sur un processeur distinct. En effet, c'est
le système d'exploitation qui décide sur quel processeur chaque thread sera exécuté, en fonction de
nombreux facteurs tels que la charge de chaque processeur et la stratégie de planification utilisée.
Toutefois, il est possible de spécifier que chaque thread doit être exécuté sur un processeur distinct
en utilisant la fonction pthread_attr_setaffinity_np. Cette fonction permet de définir les
processeurs sur lesquels le thread peut être exécuté.
Voici un exemple de programme qui crée autant de threads qu'il y a de processeurs et qui essaie de
faire en sorte que chaque thread soit exécuté sur un processeur distinct :
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
int main(void)
{
int nb_processors = sysconf(_SC_NPROCESSORS_ONLN); // Nombre de processeurs
printf("Il y a %d processeurs sur cette machine\n", nb_processors);
long i;
for (i = 0; i < nb_processors; i++) {
// Affectation du processeur i au thread
cpu_set_t cpuset;
CPU_ZERO(&cpuset);
CPU_SET(i, &cpuset);
int res = pthread_attr_setaffinity_np(&attr, sizeof(cpu_set_t),
&cpuset);
if (res != 0) {
perror("Erreur lors de l'affectation du processeur au thread");
return 1;
}
// Création du thread i
res = pthread_create(&threads[i], &attr, thread_function, (void *)i);
if (res != 0) {
perror("Erreur lors de la création du thread");
return 1;
}
}
return 0;
}
====================================================================
Pour récupérer les arguments dans le programme C, on utilise les paramètres argc et
argv
du main. L’entier argc donne le nombre d’arguments rentrés dans la ligne de
commande plus
1, et le paramètre argv est un tableau de chaînes de caractères qui contient comme
éléments :
• Le premier élément argv[0] est une chaîne qui contient le nom du fichier executable
du programme ;
• Les éléments suivants argv[1], argv[2],etc... . sont des chaînes de caractères qui
contiennent les arguments passés en ligne de commande.
=============================================================
Voici comment vous pouvez écrire un programme en C qui crée un thread, lit des
valeurs en C et les passe à un autre thread qui fait la somme de ces valeurs et affiche
le résultat de la somme par un troisième thread sans structure :
1. Incluez les fichiers d'en-tête nécessaires pour utiliser les threads en C :
#include <pthread.h>
2. Déclarez les trois threads et les variables partagées entre les threads :
pthread_t thread1, thread2, thread3;
int values[100]; // tableau pour stocker les valeurs lues
int sum = 0; // variable pour stocker la somme des valeurs
3. Écrivez la fonction pour le premier thread qui lit les valeurs en C :
void* read_values(void* arg) {
// lire les valeurs et les stocker dans le tableau values
// ...
return NULL;
}
4. Écrivez la fonction pour le deuxième thread qui fait la somme des valeurs :
void* compute_sum(void* arg) {
for (int i = 0; i < 100; i++) {
sum += values[i];
}
return NULL;
}
pthread_join(thread1, NULL);
pthread_join(thread2, NULL);
pthread_join(thread3, NULL);
return 0;
}
Voilà comment vous pouvez écrire un programme en C qui crée des threads, lit des valeurs en C,
fait la somme de ces valeurs et affiche le résultat de la somme par un troisième thread sans utiliser
de structure.