Multithreading e programmazione funzionale in Cpp0X -C++11

Share Embed Donate


Short Description

A brief tutorial on Cpp0X, in Italian...

Description

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

18 19 19 20

6 Il problema dei 5 filosofi 21 6.1 Vari approcci ingenui . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 6.2 Una soluzione funzionante . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 7 Le Condition, implementazione delle code di attesa 24 7.1 Le Condition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 7.2 Ma le cose non sono cos`ı semplici... . . . . . . . . . . . . . . . . . . . . . . 25 1

8 Il problema del barbiere addormentato 26 8.1 Il barbiere . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 8.2 Il cliente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 8.3 Codice completo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 A Ambiente di sviluppo e problemi di A.1 GNU Gcc - g++ . . . . . . . A.1.1 MinGw . . . . . . . . A.1.2 Multithreading . . . . A.2 Microsoft Visual Studio . . .

compilazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

Riferimenti bibliografici

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

31 31 31 31 31 31

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

http://michele.sciabarra.com/page/NonUsateQuelLinguaggio

3

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
View more...

Comments

Copyright ©2017 KUPDF Inc.
SUPPORT KUPDF