Ik moet voor een schoolopdracht een zeef van Eratosthenes implementeren, gebruik makend van de pthread library.
Voor het opstarten van een thread moet ik een functie hebben in de vorm:
Nu moet een thread 2 dingen weten:
- een bepaalde id
- van welk getal hij de meervouden van de lijst moet strepen
Dus ik heb een struct:
en de functie die elke thread zal uitvoeren:
De main functie maakt threads aan door de volgende functie aan te roepen:
Het probleem is dat in de StrikeMultiples() functie de 'job' parameter naar totale onzin wijst.
Ik heb het idee dat de job in een andere functie scope wordt aangemaakt, zijn adres doorgespeeld naar een andere functie en vervolgens bestaat er niks meer op dat adres wanneer dat ge"dereferenced" wordt (omdat de functie scope waarin job bestond geeindigd is).
Heb ik het goede idee? En weet iemand hier een oplossing voor?
Alvast bedankt,
Arjan
Voor het opstarten van een thread moet ik een functie hebben in de vorm:
Code:
void *Functie(void *p)
Nu moet een thread 2 dingen weten:
- een bepaalde id
- van welk getal hij de meervouden van de lijst moet strepen
Dus ik heb een struct:
Code:
typedef struct {
unsigned long long p; // which multiples to strike
int id; // thread id
} JOB;
en de functie die elke thread zal uitvoeren:
Code:
void *StrikeMultiples(void *job) {
// cast and dereference
JOB j = *((JOB*)job);
printf("Thread%i: striking multiples of %llu.\n", j.id, j.p);
// strike multiples of n
unsigned long long i;
for (i = j.p*2; i <= NROF_SIEVE; i += j.p) {
Strike(i);
}
status[j.id] = done;
return NULL;
}
De main functie maakt threads aan door de volgende functie aan te roepen:
Code:
void CreateThread(int id, unsigned long long p) {
JOB j;
j.id = id;
j.p = p;
++nrof_running;
status[id] = running;
printf("CreateThread: creating thread with id = %i, p = %llu.\n", j.id, j.p);
pthread_create(&threads[id], NULL, StrikeMultiples, (void*)(&j));
}
Het probleem is dat in de StrikeMultiples() functie de 'job' parameter naar totale onzin wijst.
Ik heb het idee dat de job in een andere functie scope wordt aangemaakt, zijn adres doorgespeeld naar een andere functie en vervolgens bestaat er niks meer op dat adres wanneer dat ge"dereferenced" wordt (omdat de functie scope waarin job bestond geeindigd is).
Heb ik het goede idee? En weet iemand hier een oplossing voor?
Alvast bedankt,
Arjan