PDA

Visualizza la versione completa : [C] threads, evitare l'accesso non autorizzato alle variabili passate


xnavigator
26-05-2010, 00:35
salve ragazzi.

ho un piccolo codice che crea un certo numero di threads. ( pari al numero di elementi presenti in una matrice bidimensionale NxN )


alla funzione che eseguirò come threads mi serve passare 2 elementi interi (che altro non sono i 2 indici i e j degli elementi della matrice )

questo è il semplice codice:



struct arrayIndexes {
int i,j;
};

void *myThreadFunc(void *arg) {
struct arrayIndexes myAI = *((struct arrayIndexes *)arg);
// alcune operazioni...
}

void main() {
struct arrayIndexes myAI;
for(i=0;i<n;i++)
for(j=0;j<n;j++) {
myAI.i=i; myAI.j=j;
pthread_create(&(threads[i][j]),NULL,myThreadFunc,&myAI);
sleep(1);
}
}


come vedete faccio i*j pthread_create, mi salvo l'indice corrente nella struct myAI e lo passo come argomento alla funzione (cosi i vari thread avranno un indice preciso su cui lavorare).

Il problema è che ho dovuto aggiungere quella sleep perchè altrimenti le funzioni prendevano dei valori "accavallati" dall'argomento myAI.
(Probabilmente per motivi causati dallo scheduler)

c'è un modo per evitare di usare la sleep?

oregon
26-05-2010, 01:47
Crea un semaforo

Aggiungi alla tua struttura l'handle al semaforo creato

Passa il puntatore alla pthread_create

Subito dopo la pthread_create (nel codice che crea i thread) mettiti in attesa del semaforo

Nel thread, copia i dati che ti servono dalla struttura in variabili locali e dopo segnala il semaforo

Nel codice parent, chiudi il semaforo

xnavigator
26-05-2010, 02:10
Originariamente inviato da oregon
Crea un semaforo

Aggiungi alla tua struttura l'handle al semaforo creato

Passa il puntatore alla pthread_create

Subito dopo la pthread_create (nel codice che crea i thread) mettiti in attesa del semaforo

Nel thread, copia i dati che ti servono dalla struttura in variabili locali e dopo segnala il semaforo

Nel codice parent, chiudi il semaforo

:ecco:

mh in effetti con l'uso dei semafori gestirei proprio l'accesso a quella struct però vorrei fare qualocsa di più semplice (anche perchè ancora devo studiare i semafori in c)...

esempio:
Faccio un array di quella struct contenente tanti elementi quanti il numero di thread che mi serve e ad ogni thread gli passo il puntatore all'elemento corrispondente presente nell'array... :fagiano:

oregon
26-05-2010, 02:20
Originariamente inviato da xnavigator
...
esempio:
Faccio un array di quella struct contenente tanti elementi quanti il numero di thread che mi serve e ad ogni thread gli passo il puntatore all'elemento corrispondente presente nell'array... :fagiano:

Con i semafori (che potresti studiare) avresti imparato qualcosa in piu' e risolto in maniera "corretta" ... :bhò:

A questo punto, potresti semplificare ancora passando un valore solamente al posto di i e j ...

xnavigator
26-05-2010, 11:47
Originariamente inviato da oregon

A questo punto, potresti semplificare ancora passando un valore solamente al posto di i e j ...

?

per esempio passare un numero abbastanza grade che ha alle estremità i due indici?

tipo:

int i=20000001?

oregon
26-05-2010, 12:23
Quasi ... considera che un valore a 32 bit puo' essere composto da 2 a 16 bit. Quindi se devi passare 1 e 2 passerai

0x00010002

ovvero un valore a 32 bit facilmente scomponibile in due da 16

Loading