TPS IV
Attività di Tecnologie e Progettazione
Attività 1 (TEORIA) - COBEGIN – COEND - Attività personale
Inventa un esercizio:
Che può essere risolto con cobegin-coend con almeno 12 attività, minimo 3 e massimo 4 attività contemporanee
Fai il disegno (paint/word, ecc...)
Scrivilo in pseudo linguaggio con i cobegin
Scrivilo in pseudo linguaggio con i fork
L'esercizio deve essere chiaro, comprensibile, curato e presentarsi bene come il pdf allegato sotto
Consegna sul registro elettronico la soluzione con la consegna.
Prendi spunto per come si fa su http://corsiadistanza.polito.it/corsi/pdf/04ADYDC/eserc9.pdf
Attività 2 (LAB) - Thread in C ++ - Conto alla rovescia
Basandoti su quanto trovi sul libro o sul seguente video, risolvi questo esercizio.
Esercizio (Bomba ad orologeria):
Scrivi un programma che generi due thread che eseguono entrambi un conto alla rovescia a partire da 10 fino ad arrivare a 0 visualizzandolo sullo schermo.
Quando arriva a zero fai capire che è esploso qualcosa con colori, suoni, esplosioni e raccapriccio. Abbellisci il conto alla rovescia anche con il gotoxy. Sotto trovi la semigraf.h.
Il processo padre si sospende in attesa della terminazione del thread.
Linea guida dell'esercizio:
Un thread è un "sotto processo" del processo principale del programma e dipende da lui. "Gira" inoltre all'interno della stessa area di memoria.
Creare un thread è semplice: scrivi in una funzione con un po' di void * che fa quello che vuoi eseguire nel thread e la "lanci" con thread_create.
#include <pthread.h>
#include <iostream>
#include <unistd.h>
using namespace std;
void * codice_thread(void *arg) { // Attenzione ai void * OBBLIGATORI!
cout << "il pid del figlio \x8a: " << getpid() << endl; // quanto vale il pid rispetto al padre?
// Lo stampa?
return NULL;
}
int main() {
pthread_t miothread; // l'identificativo del thread
cout << "Il pid del main \x8a: " << getpid() << endl;
pthread_create(&miothread, NULL, &codice_thread, NULL); // lancio il thread
cout << "miothread: " << miothread << endl; // Lo stampa? Prova ad aggiungere uno sleep(1);
return 0;
}
Attività 3 (LAB) - Thread in C ++ - Passaggio dei parametri
Date un occhio al passaggio dei parametri sul video. Quindi ricordando il codice necessario al passaggio di un parametro
void * codice_thread(void *arg) {
int valore = *((int*)arg);
cout << valore; // stampa 33
...
int main() {
int c = 33;
pthread_t miothread; // l'identificativo del thread
pthread_create(&miothread, NULL, &codice_thread, &c); // lancio il thread
...
Il Sillabatore (esercizio):
Passa ad un thread una stringa inserita dal'utente e il thread stampa con i colori la stringa carattere per carattere con un intervallo predefinito. Il thread principale finisce quando il thread figlio è finito.
Extra: Insieme alla stringa chiedi all'utente quanto tempo desidera tra una lettera e l'altra e passa al thread anche il tempo scelto.
Attività 4 (LAB) - Thread in C ++ - Ritorno dei valori
Dopo avere visto il video che spiega come restituire i valori dal main, svolgi questo
Esercizio:
Il programma principale crea un thread che chiede all'utente di inserire una stringa. Quindi ritorna il numero di caratteri della stringa e il main stampa quanti caratteri ha inserito e il tempo che ha impiegato.
Guida all'esercizio
void * codice_thread(void *arg) {
int * ris = new int; // deve essere dichiarato così
// Il codice che vuoi...
* ris = 8; // Assegno a ris il valore che devo passare
// ... finisco il codice che vuoi e ritorno il valore
pthread_exit(ris); // return(ris) è equivalente;
}
int main() {
int * res;
pthread_t miothread;
pthread_create(&miothread, NULL, &codice_thread, NULL); // lancio il thread
pthread_join(miothread, (void**)&res); // recupero il valore passato dal thread,
// si usa sempre (void**)
cout << *res;
return 0;
}
Per calcolare il tempo puoi usare:
#include <time.h>
...
time_t seconds; seconds = time (NULL); cout << "Seconds since January 1, 1970: " << seconds;
Attività 5 (LAB) - Thread in C++ - Somma di numeri
Scrivi un programma che gestisca due variabili globali di tipo intero (int num1=500, num2=0;) e attiva due copie dello stesso thread per “spostare” una parte del primo numero nel secondo numero. ll thread riceve in la quantità da “spostare” decisa nel main e sposta la quantità da num1 a num2 e restituisce la quantità spostata al main.
Il processo principale attende la terminazione dei due figli e visualizza i nuovi valori delle due variabili, il loro totale e le due quantità casuali scelte.
Esempio esecuzione:
Il main estrae due numeri casuali da 0 a 250
Il main attiva due copie dello stesso thread, Thread1 e Thread2 passandogli un numero a uno e uno all'altro
Thread1 riceve ad esempio 56, Thread2 riceve ad esempio 12
Thread1 toglie 56 da num1 e lo aggiunge a num2 -> num1 = 444, num2 = 56 e restituisce la radice quadrata di 56 al main
Thread2 toglie 12 da num1 e lo aggiunge a num2 -> num1 = 432, num2 = 68 e restituisce la radica quadrata di 12 al main
Il main stampa num1, num2, il totale che deve essere 500 e le due radici
Provate senza sleep e con sleep.
Attività 6 (LAB) - Thread in C++ - Mutex (per casa)
Guarda il video numero 3 sui thread che spiega come usare i mutex per evitare che dei thread si sovrappongano scrivendo sullo schermo. Puoi trovare il codice qui.
Rifai l'esercizio che vedi:
Utilizzando quattro elementi invece che tre
Cambiando la x con un altro elemento
Facendo un'altra variazione a piacere
Aggiungi un nuovo thread che fa scorrere un carattere dall'alto al basso
Consegnalo dove consegni di solito.
Guida all'esercizio:
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; // Variabile Globale
pthread_mutex_lock(&mutex); // chiede il lock quando ti serve
pthread_mutex_unlock(&mutex); // rilascia il lock
Attività 7 (LAB) - Thread in C++ - Simulazione verifica
Svolgi e consegna gli esercizi allegati. Per vedere il video serve Word e devi abilitare la modifica.
Attività 8 (TEORIA) - Domande sul capitolo 2.2 - La sincronizzazione tra processi
Svolgi l'esercizio allegato Esercizio Capitolo 2.2.docx
Attività 9 (TEORIA) - Thread in java
I thread in java si possono creare in vari modi, usando l'interfaccia Runnable o estendendo la classe Thread.
Cerca su internet un esempio che usa la classe Runnable
Cerca un esempio che estende la classe Thread
Cerca quali sono le differenze tra Thread e Runnable (Ad esempio ho verificato che Runnnable sembra non creare veramente un thread... ma andrebbe verificato)
Cerca il codice dello sleep()
In base a quanto hai ricercato scrivi un programmino che lancia due thread che fanno il conto alla rovescia contemporaneamente