Relazione realizzata nell'ambito del corso di Programmazione ad Oggetti del professore Matteo Gaeta, CDL Ingegneria Informatica, anno accademico 2007/2008, Università degli Studi di Salerno.…Full description
Relazione realizzata nell'ambito del corso di Programmazione ad Oggetti del professore Matteo Gaeta, CDL Ingegneria Informatica, anno accademico 2007/2008, Università degli Studi di Salerno.…Full description
Full description
Camurati - QuerFull description
Programmazione in CFull description
Programmazione neurolinguistica
Full description
JJ — n. 3 — marzo-aprile 2007 Programmazione AOP con AspectJ di Mattero Baccan Dopo anni di programmazione strutturata, si è passati ad anni di programmazione ad oggetti. Ora si inizia a parlare d...
Testo di Anatomia topografica per fisioterapistiFull description
schemaFull description
Programmazione in C
catDescripción completa
Descripción completa
Principali concetti della programmazione con Thread. esempi con un Modello di automa cellulare e simulatore di un sistema automatico di produzione.Full description
Descripción completa
liceo didattica
Multithreading e programmazione funzionale in Cpp0X C++11 Vincenzo La Spesa 10 aprile 2012
Indice 1 Introduzione: Il C++ non `e ancora morto 1.1 Lo standard C++0X - C++11 . . . . . . . . . . . . . . . . . . . . . . . .
3 4
2 il C++ e le lambda 2.1 Il caso pi` u semplice, le funzioni void . . . . . . . . 2.2 Le funzioni che usano e restituiscono parametri . . 2.3 Le funzioni lambda e la visibilit` a . . . . . . . . . . 2.4 Funzioni che ricevono funzioni e funzioni anonime . 2.5 Qualche esempio funzionale ( che funziona) . . . .
4 5 5 6 7 7
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
3 Il C++ e il Multithreading 10 3.1 Allochiamo il nostro primo thread . . . . . . . . . . . . . . . . . . . . . . 10 3.2 Thread e condivisione dei dati . . . . . . . . . . . . . . . . . . . . . . . . . 12 3.3 Allocare un Thread senza creare un oggetto . . . . . . . . . . . . . . . . . 13 4 Sincronizzazione dei Thread e gestione delle risorse con i Mutex 14 4.1 I Mutex . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 4.2 Mutex ed eccezioni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 5 Uso avanzato dei Mutex 5.1 Timed mutex e la prenotazione con timeout massimo . . . . . . . . . . . . 5.2 Accesso alle funzioni interne del mutex . . . . . . . . . . . . . . . . . . . . 5.2.1 Prenotazione multipla . . . . . . . . . . . . . . . . . . . . . . . . .
v1.0.0 http://www.thedarshan.com/ [email protected] Quest’opera `e stata rilasciata sotto la licenza Creative Commons Attribuzione-Non commerciale-Condividi allo stesso modo 2.5 Italia. Per leggere una copia della licenza visita il sito web http://creativecommons.org/licenses/by-nc-sa/2.5/it/ o spedisci una lettera a Creative Commons, 171 Second Street, Suite 300, San Francisco, California, 94105, USA.
Questo documento `e stato prodotto e impaginato con LATEX
2
1 Introduzione: Il C++ non `e ancora morto Uno dei linguaggi che ho visto pi` u maltrattare all’Universit` a e di conseguenza poi da molti (sedicenti e/o futuri) ingegneri del software che hanno fatto il grave errore di accettare acriticamente le illazioni dei professori `e il C++ (un mio professore ne aveva quasi terrore... ) Michele Sciabarr`a anni fa scrisse in un suo post 1 veramente geniale: C++ Livello di complessit` a: ESAGERATO. Per impararlo ci metti met` a della tua vita. E poi impieghi l’altra met`a a convincere gli altri a impararlo, perch´e devi giustificare a te stesso PERCHE’ hai perduto met`a della tua vita. Credi di fare una cosa, e invece ne fai un’altra. La stessa cosa, in un caso significa una cosa e in un altro significa un’altra. Senza contare che la stessa cosa per un compilatore significa una cosa, per un altro c’`e un bug che la fa diventare un’altra, e in un altro ancora non `e supportata. E non abbiamo ancora considerato i template. Ora, Sciabarr` a scherzava ma cpp si dicono molte cose cattive...la maggior parte delle quali secondo me derivano da un confronto inappropriato e stupido con Java, si dice prima di tutto che
Il C++ ` e troppo complicato! nessuno lo conosce per intero! Il cpp non `e complicato, `e vasto. L’idea che un linguaggio vada imparato e usato per intero `e tipica dei linguaggi di nuova generazione come il Java, ma non `e assolutamente una cosa necessaria in genere. Il cpp parte dal principio che se `e possibile fare una cosa il linguaggio deve permetterlo, se poi i 4 tipi di cast o l’ereditariet`a multipla ti fanno orrore o paura...non usarli! Resta il fatto che siano utili e comodi per fare workaround, e i workaround servono ( nel mondo reale almeno) e anche fare cose orribili come modificare le variabili dichiarate costanti pu` o tornare utile. un altra idea ancora pi` u stupida ma comunque abbastanza in voga e che: La libreria del C++ ` e scarna! Confondere la libreria di un linguaggio con il linguaggio `e veramente stupido! anche dare per assunto che un linguaggio necessiti di una libreria intrinseca lo `e, peraltro le stl e la libreria standard offrono un set di funzionalit`a che copre tutte le necessit`a di base, e per il resto se ne trovano a palate di librerie pronte. E adesso veniamo al vero motivo per cui sto scrivendo: 1
1.1 Lo standard C++0X - C++11 Dicevo che c++ non `e morto e si continua ad evolvere, il suo ultimo standard non `e quello del 1998 che tutti conoscono ( o dicono di conoscere) e nemmeno quello del 2003. Nel 2008 il ’C++ Standards Committee’ ha sviluppato un nuovo standard chiamato provvisoriamente Cpp0X, la bozza `e stata presentata con il nome di N3126 il 21 agosto 2010. Il 25 marzo 2011 l’ISO vota la bozza finale (targata N3290) che viene contrassegnata come FDIS (Final Draft International Standard). Il 1o settembre 2011 viene pubblicata la versione finale del C++11 da parte di ISO e IEC. La nuova versione introduce molte nuove funzionalit`a, sia nel linguaggio che nella sua libreria standard tra cui le pi` u importanti sono il supporto alla programmazione funzionale ( delegate e lambda function) e al multithreading con l’inclusione nelle stl di un interfaccia completa ai pthread ( e chi abbia mai lavorato con quei cosi sa quanto sia prolissa attualmente la loro gestione). Attualmente il nuovo standard `e supportato dalle ultime versioni di Microsoft Visual Studio e dagli ultimi Gcc utilizzando dei flag di compilazione, le procedure di compilazione sono esposte alla fine del tutorial.
2 il C++ e le lambda Un interessante funzione introdotta nello standard C++0X sono le lambda Le funzioni lambda sono tipiche dei linguaggi che applicano il paradigma della programmazione funzionale ( completamente o in maniera ibrida) e permettono di trattare le funzioni come se fossero oggetti, potendole quindi definire in qualunque punto del codice e assegnare a una variabile. Vediamo un esempio di come questo approccio sia stato implementato nel cpp
4
2.1 Il caso pi`u semplice, le funzioni void Listing 1: le funzioni void - void #include using namespace s t d ; auto lambda = [ ] ( ) { cout << ” Questa e ’ una lambda ” << e n d l ; }; i nt main ( ) { auto lambda2 = [ ] ( ) { cout << ”Una lambda puo ’ e s s e r e d e f i n i t a anche d e n t r o un a l t r a f u n z i o n e ” << e n d l ; }; cout << ” H e l l o wo r ld ! ” << e n d l ; lambda ( ) ; lambda2 ( ) ; return 0 ; }
come si vede dal codice abbiamo definito due funzioni lambda assegnandole a variabili, adesso vediamo come comportarsi per definire funzioni che usano o producono valori (queste qui erano void− > void)
2.2 Le funzioni che usano e restituiscono parametri Listing 2: Le funzioni che usano e restituiscono parametri i nt main ( ) { auto somma = [ ] ( i nt a , i nt b ) { return ( a+b ) ; }; auto p r o d o t t o = [ ] ( i nt a , i nt b ) −> i nt { return ( a+b ) ; }; cout << ” 2+2 f a ” << somma ( 2 , 2 ) << e n d l ; cout << ” 2∗2 f a ” << p r o d o t t o ( 2 , 2 ) << e n d l ; return 0 ; }
5
la lista dei parametri in entrata viene dichiarata tra le parentesi tonde, il tipo del parametro in uscita pu`o essere definito esplicitamente con − > come nel caso di prodottoo lasciato implicito come nel caso di somma e in questo caso viene dedotto dal compilatore A questo punto vi starete chiedendo a che servano le parentesi quadre suppongo
2.3 Le funzioni lambda e la visibilit`a La programmazione a oggetti ci ha abituato al concetto di visibilit`a di una variabile, per esempio una funzione definita dentro una classe accede agli oggetti della classe, ma una lambda che pu`o essere definita in qualunque punto del codice a cosa pu` o accedere? la risposta `e: assolutamente a nulla se si vuole fare in modo che qualcosa venga visto dall’interno di una lambda bisogna passare il suo reference tra le quadre, vediamo un esempio Listing 3: un codice che non funziona i nt main ( ) { i nt c ; auto somma = [ ] ( i nt a , i nt b ) { c=a+b ; }; ...
la compilazione del pezzo di codice precedente ci dar`a un error: ’c’ is not captured per renderlo visibile dobbiamo fare questo Listing 4: Il modo giusto di procedere i nt main ( ) { i nt c ; auto somma=[&c ] ( i nt a , i nt b ) { c=a+b ; }; somma ( 2 , 2 ) ; cout << ” 2+2 f a ” << c << e n d l ; return 0 ; }
quindi passando un puntatore a this a una lambda rendiamo visibile l’intero oggetto. `e addirittura possibile passare l’intero contesto usando [&] e [=] dove la prima passa per reference e la seconda per valore
6
2.4 Funzioni che ricevono funzioni e funzioni anonime Una caratteristica fondamentale della programmazione funzionale `e la possibilit`a di passare funzioni ad altre funzioni, in questo caso per`o la sintassi del cpp `e un po sporca e siamo costretti ad usare la libreria functional perch´e non `e interamente possibile farlo direttamente usando solo il linguaggio e le sue keyword, ci servir` a la classe generica f unction < tipouscita(tipiingresso) > nell’esempio possiamo notare che `e anche possibile definire una funzione e passarla senza assegnarla a una variabile, la funzione resta quindi anonima Possiamo inoltre vedere come sia possibile modificare il comportamento di una fuzione dal suo esterno passandogli un altra funzione, infatti nel primo caso scrivisomma scrive sullo stdout mentre nel secondo su file Listing 5: funzioni che ricevono funzioni #include #include #include using namespace s t d ; i nt main ( ) { i nt c ; char∗ f i l e n a m e=” d a t i . t x t ” ; auto scr iviso mma =[&]( i nt a , i nt b , const f u n c t i o n & w r i t e r ) { c=a+b ; writer ( c ); }; auto s c r i t t o r e =[=]( i nt x ) { ofstream myfile ; m y f i l e . open ( f i l e n a m e ) ; m y f i l e << x << ” \n” ; myfile . close ( ) ; }; scr iviso mma ( 2 , 2 , s c r i t t o r e ) ; scr iviso mma ( 2 , 2 , [ ] ( i nt x ) { cout << x << e n d l ; } ) ; return 0 ; }
2.5 Qualche esempio funzionale ( che funziona) Adesso cerchiamo di inventarci qualcosa che sia comodo da realizzare con la programmazione funzionale e scomodo con quella procedurale... Abbiamo visto il caso precedente di una funzione che si aspetta un’altra funzione da utilizzare per scrivere i dati. Un
7
altro uso molto diffuso delle lambda ci permette di modificare il comportamento di un algoritmo passandogli un altro algoritmo, un semplice esempio `e una generica funzione di ordinamento a cui passiamo una funzione di confronto, questo ci permette sia di ordinare ogetti di tipi non conosciuti dalla funzione e non ordinabili a priori sia di modificare le relazioni di ordine.
8
Listing 6: un esempio completo #include #include #include #include #include #include #include