interrupt o multithreading

Installazione, configurazione e utilizzo di Debian su Raspberry pi

interrupt o multithreading

Messaggioda velvettiere84 » 17/09/2017, 9:44

Buongiorno a tutti,

ho cominciato a fare qualche programma per raspberri pi3 in C compilandolo con l'ultima versione di gcc disponibile.

Il mio problema è il seguente: vorrei effettuare un programma (lanciare un processo) che sia in grado di effettuare più cose contemporaneamente per scaricare il carico computazionale della CPU ed essere più efficiente nell'esecuzione dei programmi.
Ho capito che questa operazione può essere eseguita strutturando il programma per l'uso di threads e non in polling.

L'idea è quella di far lampeggiare un led di stato una volta al secondo e contemporanemante leggere la temperatura da un adc spi con una funzione dedicata che calcola la temperatura e plotta il valore su una consolle seriale.

Come dovrei fare? Se non ho capito male dovrei creare un programma che sia in grado di instanziare 2 threads che girano contemporanemante anzichè operare in polling come ho sempre fatto fin'ora perchè questo, in programmi complessi, vorrebbe dire grande carico computazionale e tempistiche non rispettate.

E' corretto quello che ho detto? Qualcuno mi potrebbe aiutare nella realizzazione di ciò?

Grazie mille. Saluti.
SO : Debian Wheeze x64
MoBo : Asus P5G41T-M LX
CPU : Intel Core2Duo E5700
Ram : 2 x 4 GB Corsair CMZ DDR3
Video : Asus Nvidia ENGTS 450
HDD : 1 TB x 7200 rpm Segate Barracuda 32 Mb cache
Dual monitor Samsung 24 '' HDMI (1920x1080) + IBM L150 (1280x1024)
velvettiere84
Sr. Member
Sr. Member
 
Messaggi: 273
Iscritto il: 05/03/2012, 22:13

Re: interrupt o multithreading

Messaggioda Aki » 17/09/2017, 16:22

Prova ad inviare il codice che hai già realizzato con le proposte di variazione per aver il supporto dei threads. Per i threads puoi, ad esempio, studiare queste pagine: https://computing.llnl.gov/tutorials/pthreads/#Thread ; vedi anche https://www.youtube.com/watch?v=i4-jvPYdloc
Aki
Global Moderator
Global Moderator
 
Messaggi: 7387
Iscritto il: 27/12/2007, 16:59

Re: interrupt o multithreading

Messaggioda velvettiere84 » 21/09/2017, 20:39

Aki ha scritto:Prova ad inviare il codice che hai già realizzato con le proposte di variazione per aver il supporto dei threads. Per i threads puoi, ad esempio, studiare queste pagine: https://computing.llnl.gov/tutorials/pthreads/#Thread ; vedi anche https://www.youtube.com/watch?v=i4-jvPYdloc



Codice: Seleziona tutto
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>  ///per funzione sleep, necessaria anche per i thread, getpid()
#include <pthread.h>
#include <sys/types.h> /// necessaria per funzione getpid()
#include <sys/syscall.h>   /// needed for gettid()

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

int counter = 0;

void *somma(){

        for(int i=0; i<10000000; i++) {
            pthread_mutex_lock(&mutex);
            counter++;
            pthread_mutex_unlock(&mutex);
        }
    printf ("Counter Value %d from PID %d and SPID %d\n\n\n",counter, getpid(), syscall(SYS_gettid));
}


int main(){

    int pid = getpid();
    int TID = 0; ///Actual execution thread ID

    printf("---  L'applicazione è stata avviata ----\n\n\n");
    printf("PID: %d\t\t\n\n", pid);

    ///Predisposizione dei thread che gireranno all'interno dell'applicazione in aggiunta al thread main dell'applicazione padre

    pthread_t tid1, tid2, tid3;

    pthread_create(&tid1, NULL, &somma, NULL);
    pthread_create(&tid2, NULL, &somma, NULL);
    pthread_create(&tid3, NULL, &somma, NULL);

    pthread_join (tid1, NULL);
    pthread_join (tid2, NULL);
    pthread_join (tid3, NULL);


/// Termine del programma

    exit(EXIT_SUCCESS);

    //printf("Operazione terminata con successo");
   return 0;
}






Al momento sto facendo questo per prova. Ho creato diversi codici, sincronizzato i thread e mi sembra che le cose funzionino. Però in questo codice non capisco perchè se eseguo l'applicazione la somma risultante dalla funzione implementata dai thread restituisce un valore diverso per ogni thread che la esegue.

Schermata da 2017-09-21 21-36-01.png
Schermata da 2017-09-21 21-36-01.png (93.39 KiB) Osservato 377 volte



ogni thread non dovrebbe restituire 10000000? E nel caso contrario perchè non tutti 30000000?

Grazie mille.
SO : Debian Wheeze x64
MoBo : Asus P5G41T-M LX
CPU : Intel Core2Duo E5700
Ram : 2 x 4 GB Corsair CMZ DDR3
Video : Asus Nvidia ENGTS 450
HDD : 1 TB x 7200 rpm Segate Barracuda 32 Mb cache
Dual monitor Samsung 24 '' HDMI (1920x1080) + IBM L150 (1280x1024)
velvettiere84
Sr. Member
Sr. Member
 
Messaggi: 273
Iscritto il: 05/03/2012, 22:13

Re: interrupt o multithreading

Messaggioda velvettiere84 » 22/09/2017, 7:14

Aki ha scritto:Prova ad inviare il codice che hai già realizzato con le proposte di variazione per aver il supporto dei threads. Per i threads puoi, ad esempio, studiare queste pagine: https://computing.llnl.gov/tutorials/pthreads/#Thread ; vedi anche https://www.youtube.com/watch?v=i4-jvPYdloc


Altra cosa: quando lancio il software il sistema quad core mi va al 100%.

Ma possibile che un ciclo for e 3 thread sono cosi pesanti? I thread appunto non dovrebbero essere fatti per alleggerire il carico del sistema?

Grazie
SO : Debian Wheeze x64
MoBo : Asus P5G41T-M LX
CPU : Intel Core2Duo E5700
Ram : 2 x 4 GB Corsair CMZ DDR3
Video : Asus Nvidia ENGTS 450
HDD : 1 TB x 7200 rpm Segate Barracuda 32 Mb cache
Dual monitor Samsung 24 '' HDMI (1920x1080) + IBM L150 (1280x1024)
velvettiere84
Sr. Member
Sr. Member
 
Messaggi: 273
Iscritto il: 05/03/2012, 22:13

Re: interrupt o multithreading

Messaggioda marcomg » 22/09/2017, 8:01

velvettiere84 ha scritto:Ma possibile che un ciclo for e 3 thread sono cosi pesanti? I thread appunto non dovrebbero essere fatti per alleggerire il carico del sistema?

Lasciando perdere che per fare quello che stai cercando basta la formula per le somme parziali di gauss.
I thread li usi per poter usare più processori e per fare del vero (o simulato dallo scheduler) multitasking quindi o un lavoro in background senza mandare in freeze l'interfaccia oppure per esempio volendo sfruttare tutti e 4 i core fisici per un lavoro esoso ;)
velvettiere84 ha scritto:ogni thread non dovrebbe restituire 10000000? E nel caso contrario perchè non tutti 30000000?

No perché stai usando una variabile globale, il thread che finisce prima stampa a quanto sono arrivati tutti. Se dichiari come auto la variabile counter all'interno della funzione vedrai che arrivano tutti a 10000000.
Windows is what you open when you want fresh air from outside.
Avatar utente
marcomg
Global Moderator
Global Moderator
 
Messaggi: 5452
Iscritto il: 22/08/2011, 18:54

Re: interrupt o multithreading

Messaggioda velvettiere84 » 22/09/2017, 8:48

marcomg ha scritto:
velvettiere84 ha scritto:Ma possibile che un ciclo for e 3 thread sono cosi pesanti? I thread appunto non dovrebbero essere fatti per alleggerire il carico del sistema?

Lasciando perdere che per fare quello che stai cercando basta la formula per le somme parziali di gauss.
I thread li usi per poter usare più processori e per fare del vero (o simulato dallo scheduler) multitasking quindi o un lavoro in background senza mandare in freeze l'interfaccia oppure per esempio volendo sfruttare tutti e 4 i core fisici per un lavoro esoso ;)
velvettiere84 ha scritto:ogni thread non dovrebbe restituire 10000000? E nel caso contrario perchè non tutti 30000000?

No perché stai usando una variabile globale, il thread che finisce prima stampa a quanto sono arrivati tutti. Se dichiari come auto la variabile counter all'interno della funzione vedrai che arrivano tutti a 10000000.


Grazie. Comunque quella dell'incremento è una routine che ho preso da un codice già fatto per mettermi nelle stesse condizioni dell'esempio. Sempre puntiglioso è? ;)

Comunque ok per il resto. Sono d'accordo. Ma come me lo spieghi che i core vanno tutti al 100%??

Grazie ancora...
SO : Debian Wheeze x64
MoBo : Asus P5G41T-M LX
CPU : Intel Core2Duo E5700
Ram : 2 x 4 GB Corsair CMZ DDR3
Video : Asus Nvidia ENGTS 450
HDD : 1 TB x 7200 rpm Segate Barracuda 32 Mb cache
Dual monitor Samsung 24 '' HDMI (1920x1080) + IBM L150 (1280x1024)
velvettiere84
Sr. Member
Sr. Member
 
Messaggi: 273
Iscritto il: 05/03/2012, 22:13

Re: interrupt o multithreading

Messaggioda marcomg » 22/09/2017, 9:52

velvettiere84 ha scritto:Sempre puntiglioso è? ;)

Spiegati meglio perché se reputi il mio intervento precedente puntiglioso smetto di rispondere. Se vuoi fare le cose alla "c***** ** *a**" e si dai, "smarmella tutto"; liberissimo, ma poi non chiedere il perché.

Comunque se fai un while true (ammesso che il compilatore non lo elimini del tutto se dentro non c'è niente) mandi il processore al 100%.
Windows is what you open when you want fresh air from outside.
Avatar utente
marcomg
Global Moderator
Global Moderator
 
Messaggi: 5452
Iscritto il: 22/08/2011, 18:54

Re: interrupt o multithreading

Messaggioda velvettiere84 » 22/09/2017, 10:16

marcomg ha scritto:
velvettiere84 ha scritto:Sempre puntiglioso è? ;)

Spiegati meglio perché se reputi il mio intervento precedente puntiglioso smetto di rispondere. Se vuoi fare le cose alla "c***** ** *a**" e si dai, "smarmella tutto"; liberissimo, ma poi non chiedere il perché.

Comunque se fai un while true (ammesso che il compilatore non lo elimini del tutto se dentro non c'è niente) mandi il processore al 100%.


Non era una critica ma un complimento perché sei sempre molto preciso. 'smarmella' poi è bellissimo hahahahhahahhahahahaahahahahhahahaaha


Comunque ok...per ora provo a scrivere il codice che ho in mente e poi ti dico. L'idea è avviare 3 thread di cui due fanno lampeggiare 2 led diversi e uno attende la pressione di un tasto per fare qualcosa. ....secondo te i thread sono la strada migliore per farlo?

Grazie
SO : Debian Wheeze x64
MoBo : Asus P5G41T-M LX
CPU : Intel Core2Duo E5700
Ram : 2 x 4 GB Corsair CMZ DDR3
Video : Asus Nvidia ENGTS 450
HDD : 1 TB x 7200 rpm Segate Barracuda 32 Mb cache
Dual monitor Samsung 24 '' HDMI (1920x1080) + IBM L150 (1280x1024)
velvettiere84
Sr. Member
Sr. Member
 
Messaggi: 273
Iscritto il: 05/03/2012, 22:13

Re: interrupt o multithreading

Messaggioda marcomg » 22/09/2017, 10:37

velvettiere84 ha scritto:Comunque ok...per ora provo a scrivere il codice che ho in mente e poi ti dico. L'idea è avviare 3 thread di cui due fanno lampeggiare 2 led diversi e uno attende la pressione di un tasto per fare qualcosa. ....secondo te i thread sono la strada migliore per farlo?

Non sapendo esattamente come il progetto prenderà forma non te lo saprei dire. Le operazioni sono asincrone? Cosa stai cercando di fare? Potresti semplicemente avere un loop infinito, usare sleep per non sovraccaricare il processore e millis per fare i controlli temporizzati (ovvio che se poi una procedura che lanci al momento della pressione del pulsante impiega più di un certo tempo i led smettono di lampeggiare mentre la procedura è in corso).
Windows is what you open when you want fresh air from outside.
Avatar utente
marcomg
Global Moderator
Global Moderator
 
Messaggi: 5452
Iscritto il: 22/08/2011, 18:54

Re: interrupt o multithreading

Messaggioda Aki » 24/09/2017, 22:23

@velvettiere84: la discussione può considerarsi risolta ?
Aki
Global Moderator
Global Moderator
 
Messaggi: 7387
Iscritto il: 27/12/2007, 16:59


Torna a Raspberry Pi

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite

cron