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:

  1. Il main estrae due numeri casuali da 0 a 250

    1. Il main attiva due copie dello stesso thread, Thread1 e Thread2 passandogli un numero a uno e uno all'altro

  2. Thread1 riceve ad esempio 56, Thread2 riceve ad esempio 12

    1. Thread1 toglie 56 da num1 e lo aggiunge a num2 -> num1 = 444, num2 = 56 e restituisce la radice quadrata di 56 al main

    2. Thread2 toglie 12 da num1 e lo aggiunge a num2 -> num1 = 432, num2 = 68 e restituisce la radica quadrata di 12 al main

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

    1. Cerca su internet un esempio che usa la classe Runnable

    2. Cerca un esempio che estende la classe Thread

    3. Cerca quali sono le differenze tra Thread e Runnable (Ad esempio ho verificato che Runnnable sembra non creare veramente un thread... ma andrebbe verificato)

    4. Cerca il codice dello sleep()

    5. In base a quanto hai ricercato scrivi un programmino che lancia due thread che fanno il conto alla rovescia contemporaneamente