comment utiliser les threads et un tableau en C
la question est:
pour écrire le programme mondial entier à une seule dimension matrice A de taille N par un facteur de M. l'utilisation de threads , le thread principal initialise Une et M entiers aléatoires, crée des threads N tels que l'ith thread trouve l'Ia = M * Ai, et enfin imprime le tableau A.
mon problème que j'ai une erreur avec initialisation de tableau aussi je ne suis pas sûr de faire les fils dans le bon sens.
j'espère que j'ai expliqué mon problème clairement.
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
int M;
int [10] A;
void *run(void *t)
{
A[(int)t]=A[(int)t]*M;
pthread_exit(NULL);
}
int main()
{
pthread_t [10] th;
srand(time(0))%20;
M=rand();
int t;
for(t = 0; t < 10; t++)
{
pthread_create(&th[t], NULL, run, (void *)t);
}
int j;
for(j=0;j<10;j++)
A[j]=j;
int i;
for(i = 0; i < 10; i++)
{
pthread_join(th[i], NULL);
printf("%d: %d\n", i,A[i]);
}
printf("Thread main\n");
pthread_exit(NULL);
}
ce sont les erreurs:
que1.c:5: error: expected identifier or ‘(’ before ‘[’ token
que1.c: In function ‘run’:
que1.c:9: error: ‘A’ undeclared (first use in this function)
que1.c:9: error: (Each undeclared identifier is reported only once
que1.c:9: error: for each function it appears in.)
que1.c: In function ‘main’:
que1.c:16: error: expected identifier or ‘(’ before ‘[’ token
que1.c:17: error: void value not ignored as it ought to be
que1.c:22: error: ‘th’ undeclared (first use in this function)
que1.c:27: error: ‘A’ undeclared (first use in this function)
- int A[10]; /* */
- Pouvez-vous corriger votre code ci-dessus aussi?
Vous devez vous connecter pour publier un commentaire.
On dirait que vous êtes d'avoir un Java arrière-plan (ou sur D), comme vous l'avez écrit
int [10] A
. Vous pouvez lire ce queA
est une variable à un tableau de 10 entiers type d'objet. Mais en C, les choses sont un peu différentes. En C il y a seulement individuel primitive variables, et ils peuvent être organisés en ensembles de continue de la mémoire, qui est alors appelé un tableau. C'est pourquoi la syntaxeint A[10];
a été choisie, ce qui signifie:A
est un pointeur d'entier, en pointant le début de automatiquement de stockage alloué pour 10 entiers.Le problème suivant avec votre programme, même si le compilateur ne sera pas un rapport c'est le passage d'un entier par le biais d'un
void*
type. En C, chaque pointeur peut être converti à certaines entier, mais pas toutes les valeurs entières de faire des pointeurs. Les pointeurs en C sont des choses abstraites: la Plupart des implémentations de choisir d'utiliser l'adresse mémoire que leur représentation entière. Mais il serait tout aussi valable pour la carte par le biais d'un injective LUT. De sorte que certaines valeurs entières risque de ne pas correspondre à un pointeur, et donc pas correctement transfert. Vous devriez vraiment passer un vrai pointeur.Également votre utilisation de threads n'est pas optimale. Dans votre cas, vous êtes bousiller les lignes de cache comme un fou et la commutation de la surcharge de manger toute la parallélisation de gain. Comme une règle générale, vous devriez ne pas créer plus de 'nombre de cœurs de PROCESSEUR' + 2 threads. En prenant tout cela en compte, vous pouvez effectuer les opérations suivantes:
La sortie de ce programme ressemble à ceci:
Votre premier problème est purement une syntaxe un. Ce n'est pas valide C:
Il devrait être:
De même pour
pthread_t [10] th;
.En plus de @Oli Charlesworth réponse,
srand
ne retourne aucune valeur, il est déclaré commevoid
, de sorte que vous ne pouvez pas écriresrand(time(0)) % 20
.