Pthreads dans Mac OS X - Mutex problème
Je suis en train d'apprendre à programmer des algorithmes parallèles en C en utilisant les threads POSIX. Mon environnement est un Mac OS X 10.5.5 avec gcc 4.
De la compilation:
gcc -Wall -D_REENTRANT -lpthread source.c -o test.o
Donc, mon problème est que si je le compiler dans un Ubuntu 9.04 boîte, il fonctionne bien dans le fil de commande, sur Mac ressemble mutex ne fonctionne pas et que les threads ne pas attendre pour obtenir de l'information partagée.
Mac:
#1
#0
#2
#5
#3
#4
ubuntu
#0
#1
#2
#3
#4
#5
Des idées?
Suivez ci-dessous le code source:
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#define NUM_THREADS 6
pthread_mutex_t mutexsum;
pthread_t threads[NUM_THREADS];
long Sum;
void *SumThreads(void *threadid){
int tmp;
int i,x[10],y[10];
//Para cada x e y do vetor, jogamos o valor de i, só para meio didáticos
for (i=0; i<10 ; i++){
x[i] = i;
y[i] = i;
}
tmp = Sum;
for (i=0; i<10 ; i++){
tmp += (x[i] * y[i]);
}
pthread_mutex_lock (&mutexsum);
Sum += tmp;
printf("Im thread #%ld sum until now is: %ld\n",threadid,Sum);
pthread_mutex_unlock (&mutexsum);
return 0;
}
int main(int argc, char *argv[]){
int i;
Sum = 0;
pthread_mutex_init(&mutexsum, NULL);
for(i=0; i<NUM_THREADS; i++){
pthread_create(&threads[i], NULL, SumThreads, (void *)i);
}
pthread_exit(NULL);
}
Il est généralement considéré comme poli de donner de la rétroaction sur les réponses que vous avez été donné.
OriginalL'auteur rafaelxy | 2009-09-11
Vous devez vous connecter pour publier un commentaire.
Il n'y a rien sur votre code qui feront de votre threads s'exécutant dans TOUT commande. Si Ubuntu est en cours d'exécution sur un peu d'ordre, il pourrait être parce que vous êtes juste de la chance. Essayez de lancer 1000 fois dans Ubuntu et voir si vous obtenez les mêmes résultats, encore et encore.
Le truc, c'est que vous ne pouvez pas contrôler la façon dont le planificateur fera de votre threads de l'accès au processeur(s). Ainsi, lorsque vous parcourez la pour boucle est de la création de votre fils, vous ne pouvez pas supposer que le premier appel à pthread_create aurez à exécuter en premier, ou vont obtenir pour verrouiller le mutex vous êtes à la création de la première. C'est l'ordonnanceur qui il au niveau de l'OS, et vous ne pouvez pas le contrôler, sauf si vous écrivez votre propre noyau :-).
Si vous voulez une série de comportement, pourquoi voulez-vous exécuter votre code dans des threads séparés en premier lieu? Si c'est juste pour l'expérimentation, puis une solution je pense, à l'aide de pthread_signal de réveiller un thread spécifique et de faire s'exécuter... Puis le thread réveillé réveil de la seconde et ainsi de suite ainsi de suite.
Espère que cela aide.
OriginalL'auteur Pablo Santa Cruz
Dans mon souvenir, la variable que vous avez protégé n'est pas réellement être partagées entre les processus. Il existe dans son contexte propre à l'intérieur de chacun des fils. Donc, c'est vraiment juste une question de quand chaque fil est prévue qui détermine ce qui sera imprimé.
Je ne pense pas qu'un simple mutex vous permettra de garantir l'exactitude, si l'exactitude est définie comme l'impression de 0, 1, 2, 3 ...
ce que votre code est en train de faire est de créer plusieurs contextes d'exécution, en utilisant le code de votre fonction somme que son code d'exécution. la variable à la protection, à moins déclarée statique, sera unique pour chaque appel de cette fonction.
en fin de compte, est-ce une coïncidence que vous avez trouvé un système pour imprimer correctement, parce que vous n'avez pas de méthode logique de blocage des threads jusqu'à ce qu'il est leur tour.
OriginalL'auteur San Jacinto
Je ne fais pas pthreads en C ou en toute autre langue (mais je ne thread de programmation sur la haute performance des ordinateurs) afin que cette "réponse" peut-être pas inutile de vous;
Ce que dans votre code exige que les fils à passer le mutex dans le thread ordre d'id ? Je vois que les threads sont créés dans l'ordre d'id, mais ce qui les oblige à exécuter dans l'ordre /
Si vous avez besoin de votre threads de s'exécuter dans l'ordre d'id, pourquoi ? Il semble un peu comme si vous êtes à la création de threads, puis serialising. À quelle fin ?
Lorsque je programme en fils et de se soucier de l'ordre d'exécution, souvent, j'essaie de créer un très grand nombre de fils et de voir ce qui se passe à l'ordre d'exécution.
Comme je l'ai dit, ignorer cette si mon manque de compréhension de C et pthreads est trop pauvre.
OriginalL'auteur High Performance Mark