Comment puis-je avoir plusieurs threads en C, travaillant sur le même pour la boucle d'un tableau à deux dimensions?
j'ai un programme en C.
J'ai créé 3 fils avec pthread_create et j'ai créé un mutex
pour verrouiller/déverrouiller les régions critiques.
La 3e argument de pthread_create est un pointeur vers une fonction que le thread s'exécuter.
Dans les exemples que j'ai trouvé dans le Web, cette fonction est toujours très simple par exemple, imprime l'id de thread ou imprime un message.
Ce qui se passe lorsque la fonction de thread exécute contient un pour la boucle?
Cause dans mon programme, je voudrais que chaque un des threads de travailler avec un tableau à deux dimensions.
Chaque thread doit trouver la somme d'une ligne d'un tableau à deux dimensions.
par exemple,
Thread1 doit calculer la somme de la première ligne du tableau en 2 dimensions
Thread2 doit calculer la somme de la deuxième ligne
Thread1 doit calculer la somme de la 3e ligne
Thread3 doit calculer la somme de la 3e ligne
Je ne se soucient pas de l'ordre des fils, mais j'ai besoin de tous les
filetage pour choisir l'une des lignes.
J'ai le code suivant qui sommes deux cellules dans le tableau à deux dimensions.
Le programme:
-
crée NTHREADS
for(i=0; i < NTHREADS; i++) { pthread_create( &thread_id[i], NULL, CalculateSum, NULL ); }
-
Chaque thread attend les autres pour finir
for(j=0; j < NTHREADS; j++) { pthread_join( thread_id[j], NULL); }
-
la fonction que chaque thread exécute mais pour UNE ligne de la matrice et PAS à l'ENSEMBLE du tableau est
void *CalculateSum(void *dummyPtr) { pthread_mutex_lock( &mutex1 ); int i,j,sum = 0; for( i = 0; i <= N-1; i++) { for( j = 0; j <= M-1; j++) { sum = dimensional_array[i][j] + dimensional_array[i][j]; } printf(" Sum = %d\n", sum); } counter++; pthread_mutex_unlock( &mutex1 ); }
L'ensemble du programme est comme suit:
Le programme n'a aucune erreur de compilation.
Afin de l'exécuter, vous ne ferez: gcc-pthread programme.c
//program.c
#include <stdio.h>
#include <pthread.h>
#define NTHREADS 3
void *CalculateSum(void *);
pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;
int counter = 0;
#define N 10
#define M 10
int dimensional_array[N][M];
main()
{
pthread_t thread_id[NTHREADS];
int i, j;
for (i = 0; i <= N - 1; i++ )
for( j = 0; j <= M - 1; j++)
dimensional_array[i][j] = i;
for(i=0; i < NTHREADS; i++)
{
pthread_create( &thread_id[i], NULL, CalculateSum, NULL );
}
for(j=0; j < NTHREADS; j++)
{
pthread_join( thread_id[j], NULL);
}
printf("Final counter value: %d\n", counter);
//print ARRAY
for (i = 0; i <= N-1; i++ ) {
for( j = 0; j <= M-1; j++)
printf("%d\t",dimensional_array[i][j]);
printf("\n");
}
}
//Calculate
void *CalculateSum(void *dummyPtr)
{
pthread_mutex_lock( &mutex1 );
int i,j,sum = 0;
for( i = 0; i <= N-1; i++) {
for( j = 0; j <= M-1; j++) {
sum = dimensional_array[i][j] + dimensional_array[i][j];
}
printf(" Sum = %d\n", sum);
}
counter++;
pthread_mutex_unlock( &mutex1 );
}
Donc, je voudrais que chaque thread pour trouver la somme d'une ligne, mais je suis confus, je ne sais pas
comment le faire.
Dans mon programme à chaque fois qu'un thread appelle la fonction Calculate, tous à la somme des lignes sont calculées et pas seulement une
[Attention:Pour des raisons de simplicité, je somme le premier élément avec c'est propre,le point est de comprendre
comment ces fils peuvent tous prendre place dans cette boucle]
Je serais heureux si quelqu'un pouvait m'aider
Merci d'avance
Aussi, dans cette boucle ajoutez somme = 0 pour( i = 0; i <= N-1; i++) {
Quel est le point de runnung plusieurs threads s'ils s'exécutent à l'intérieur d'une section critique, essentiellement, se réduisant à un seul thread d'exécution?
Ouais, je suis confus, c'est un exercice que j'ai à faire et nous allons utiliser plusieurs threads (et pas seulement un seul) de l'accès à une seule ligne du tableau en 2 dimensions, mais je ne sais pas comment faire
OriginalL'auteur programmer | 2012-11-16
Vous devez vous connecter pour publier un commentaire.
Vous devez créer un tableau de par thread paramètres, et les envoie vers les fils un par un. Dans votre cas, un seul pointeur vers
int
est suffisant: vous passez le fil de son indexthreadindex
de zéro àNTHREADS
, et le fil passe à l'arrière de la somme des lignes telles querow % NTHREADS == threadindex
.Ici est de savoir comment votre fonction de thread attend:
Oui, un
=
était en effet de manque.OriginalL'auteur dasblinkenlight
À calc à la somme d'une ligne (en ignorant le fil des trucs):
Et ensuite créer le thread comme celui-ci:
EDIT: mis "compteur++" dans.
Oui, je ne vois aucune nécessité pour que le mutex soit, mais apparemment, c'est une partie de l'OPs mission.
Après re-vérification, on dirait qu'il est là pour accéder au global "contre" variable que j'ai laissé de côté.
Ah oui, je vois maintenant. Avec la variable "compteur" vous avez très certainement faire - ne voulez-vous mettre cela dans @Johnny
OriginalL'auteur Johnny Mopp