[C] void* als functie parameter

Status
Niet open voor verdere reacties.

Arjan B

Gebruiker
Lid geworden
11 dec 2006
Berichten
364
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:
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
 
Ik had gehoopt dat ik geen malloc() en free() zou hoeven gebruiken, omdat ik dacht dat dat een heel gedoe zou gaan worden.
Maar de volgende regels hebben het opgelost:
Code:
void CreateThread(int id, unsigned long long p) {
	JOB *j = (JOB*)malloc(sizeof(JOB));
	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));
}

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;
	free(j);
	return NULL;
}
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan