Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2007
    Messaggi
    369

    [C++] - Gestione variabile multi-thread

    Salve a tutti.

    Io ho 4 thread che eseguono tutti la stessa funzione.

    Per semplicità facciamo che questa funzione faccia semplicemente la somma di 2 numeri.

    Ora, quello che io voglio fare è far si che in base a quale thread stia in quel momento eseguendo l'operazione, i 2 addendi siano diversi.

    Per spiegarmi meglio posto un piccolo pseudo-codice:

    Codice PHP:
    int somma(){

      
    int a,b

      
    if (sei il thread 1then {
         
    1;
         
    2;
      }
      if (
    sei il thread 2then {
         
    3;
         
    4;
      }

      return 
    a+b;


    inizio subito col dire che quel if (sei il thread ... ) funziona bene perchè comunico con i thread mediante messaggi WM_USER; quindi il thread entra solo nell'if che lo riguarda (testato).
    sempre per il motivo che comunico tramite messaggi, non mi è possibile passare a e b come parametri alla funzione, quindi questa opzione anche non è da considerare.

    detto questo passiamo al problema vero e proprio: facendo così, il primo thread arriva e pone a=1 e b=2; poi la cpu passa al secondo thread che pone a=3 e b=4; poi quando la cpu ritorna al primo thread, che deve ritornare la somma, lui ritorna 7 perchè di fatto la variabile è stata aggiornata dall'altro thread.

    non c'è un modo per far si che ogni thread si tenga le sue variabili?

    l'unica alternativa che mi è venuta è quella di fare un vettore di 8 interi, dove il thread 1 usa i primi due, il thread 2 i successivi e così via, ma mi sembra un inutile spreco di risorse...anche perchè se le variabili invece di essere 2 diventano 10 e i thread invece di 4 diventano 20, devo allocare 200 variabili al posto di 10!

    Grazie mille per chi mi risponderà, spero di essere stato abbastanza chiaro

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Passa i valori ai thread come parametri quando li crei.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2007
    Messaggi
    369
    mmmm.....soluzione semplice, perchè non ci ho pensato?

    però se invece la situazione fosse questa:

    all'interno della funzione ogni thread deve eseguire il codice sopra ogni volta che riceve un messaggio di tipo WM_USER+1.

    Quindi ci sarà un while(GetMessage...).

    supponiamo che le variabili a e b possano essere calcolate ad ogni iterazione (ad esempio a partire da valori nelle var. globali) ma non è detta che siano le stesse ad ogni iterazione.

    in questo caso non funzionerebbe più passare alla creazione, e non posso nemmeno passare nel messaggio perchè wParam lo uso già per altro

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Non ho capito ...

    Se passi i valori iniziali alla creazione del thread e li memorizzi in due variabili all'interno del thread, cosa c'entra poi il resto?

    E, in ogni caso, che vuoi dire con "wParam lo uso già per altro"?

    Sicuramente, se mostrassi il codice concreto, si capirebbe meglio ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2007
    Messaggi
    369
    ma il codice completo son oltre 600 righe, un pò lunghetto....e oltretutto non è nemmeno su questo pc

    dunque, mi spiego meglio

    1) per wParam: quando si invia un WM Message si possono utilizzare 2 parametri: wParam e lParam. Io uno lo uso già per altri scopi, quindi ne resta disponibile solamente un altro. E quindi in un solo parametro non riesco ad inviare sia a che b.

    2) io voglio eseguire il codice ad ogni arrivo di messaggio. quindi io avrò un codice di questo tipo

    Codice PHP:
    int funzione(){

     while(
    GetMessage(...)){
       if (
    sei il thread 1then 
         
    golbal+1
         
    golbal+2
      } 
      if (
    sei il thread 2then 
         
    golbal+3
         
    golbal+4
      } 

      ....
    some code....
     }

     return 
    0;


    in pratica il thread continua a ciclare dentro quel while fino a quando il programma non termina.

    GetMessage è bloccante, quindi il codice all'interno del while viene eseguito solo alla ricezione di un messaggio.

    la variabile global è globale, e non è detta che da un'iterazione all'altra sia rimasta inalterata.

  6. #6
    Allora dinamicamente una struct che contiene i due parametri, riempila con i valori da passare e passa un puntatore ad essa in lParam. Quando nel thread non ti servono più i parametri deallocala.
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Originariamente inviato da alfa_19
    1) per wParam ...
    Con lParam si usa passare un puntatore ad una struttura dove ci sono tutti i dati che vuoi.

    2) io voglio eseguire il codice ad ogni arrivo di messaggio ...

    la variabile global è globale, e non è detta che da un'iterazione all'altra sia rimasta inalterata.
    Attenzione quando si trattano variabili condivise tra thread. Se non prevedi una "sincronizzazione" di scritture/letture potresti avere brutte sorprese.

    Per il resto, se in

    a = global+1

    a è una variabile locale al thread (ecco a cosa serviva il sorgente, non tutto ma le piccole parti relative al problema ...), non capisco ancora cosa dovresti passare tramite il messaggio ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  8. #8
    Utente di HTML.it
    Registrato dal
    Jun 2007
    Messaggi
    369
    si lo so che su lParam posso mettere il puntatore, ma a questo punto è la stessa cosa di dichiarare un array[8] come descritto nel mio primo post.

    il problema è che se io lascio il codice così com'è (si a è locale) arriva il thread 1 che pone a=global+1; poi la cpu passa al thread 2 che pone a=global+3; poi la cpu ritorna al thread 1 che fa quello che deve fare ma con il valore di a sbagliato.

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Sì ma non puoi pretendere la botte piena e la moglie ubriaca ... se ti servono delle variabili diverse per thread, le devi allocare. Se non vuoi allocare spazio perché secondo te è sprecato, allora avrai delle variabili comuni. Non mi pare ci sia alternativa.

    Puoi utilizzare delle variabili "per thread" sfruttando il

    Thread Local Storage

    http://msdn.microsoft.com/en-us/libr...sktop/ms686749(v=vs.85).aspx

    scrivendo ad esempio

    __declspec( thread ) int tls_i = 1;

    ma la questione non cambia ... avrai utilizzato una variabile per thread.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  10. #10
    Utente di HTML.it
    Registrato dal
    Jun 2007
    Messaggi
    369
    ok grazie

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 © 2024 vBulletin Solutions, Inc. All rights reserved.