Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    [C] threads, evitare l'accesso non autorizzato alle variabili passate

    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:

    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?

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    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
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    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


    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...

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    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...
    Con i semafori (che potresti studiare) avresti imparato qualcosa in piu' e risolto in maniera "corretta" ...

    A questo punto, potresti semplificare ancora passando un valore solamente al posto di i e j ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    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?

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    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
    No MP tecnici (non rispondo nemmeno!), usa il forum.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.