C++ e multithread

16 risposte [Ultimo contenuto]
Ritratto di Stobby
Stobby
(Junior)
Offline
Junior
Iscritto: 19/12/2010
Messaggi: 13

Ciao a tutti,
apro questo thread per chiedere qualche informazione sul seguente argomento: programmazione C++ e multithreading.

Sto infatti cominciando ad interessarmi all'argomento ma, essendo un campo completamente diverso dalla programmazione single thread, ho trovato molta varietà nelle informazioni disponibili sull'argomento.
Vi chiedo pertanto una mano per riordinare le idee Smile.

I miei dubbi principali sono:

1) Come la programmazione single thread può essere ricondotta ad uno standard da cui sono state derivate versioni dipendenti dal sistema operativo (standard ANSI) esiste uno standard, almeno "concettuale" per il multithreading o è tutto dipendente dal sistema operativo?

2) Il programma multithread è un software che esegue copie "complete" di se stesso di cui sono eseguite solo funzioni particolari oppure fisicamente esegue solo parti di codice?

3) Quando si parla di ambiente di esecuzione dei thread, cosa si intende?

Come al solito... conoscete qualche buon libro/link?

Ciao e grazie!!

Ritratto di marcosan
marcosan
(Collaboratore)
Offline
Collaboratore
Iscritto: 16/05/2005
Messaggi: 730

Ciao, non sono un esperto di programmazione multithreading o in parallelo. Quel poco che ho visto riguarda la programmazione su cluster in C utilizzando le librerie MPI. Per il multithreading ti consiglio di dare un'occhiata alle OpenMP.

Sito OpenMP: http://openmp.org/wp/

Materiale su OpenMP: http://openmp.org/wp/resources/

Non credo di averti detto nulla che tu non abbia gia' visto, ma questi sono i miei due cents!

Ciao,
Marco

"La matematica e' l'arte di dare lo stesso nome a cose diverse."
H.Poincare (1854-1912).

Ritratto di mcortese
mcortese
(Guru)
Offline
Guru
Iscritto: 27/02/2009
Messaggi: 640

POSIX definisce un'API standard per la gestione dei thread. Questa API si traduce in una serie di funzioni usabili in vari linguaggi. Per quanto riguarda il C++ non ho idea, ma vuoi partire dal C, prova man pthread (pthread è il nome dell'implementazione GNU dei thread POSIX).

Un programma multithread è un singolo processo (quindi con un unico codice e un unico spazio di memoria) all'interno del quale più funzioni vengono schedulate indipendentemente. In pratica, ad un certo punto del tuo programma chiami pthread_create(funzione, args) e nasce un nuovo thread che non fa altro che eseguire funzione(args) in parallelo.

La differenza rispetto a fork() è che il nuovo thread condivide con il processo che l'ha creato molte risorse (la memoria, i file aperti, ecc.). Questo rende più facile lo scambio di dati tra thread, ma obbliga a usare tecniche di sincronizzazione per evitare che due thread scrivano contemporaneamente sulla stessa risorsa.

Per saperne di più: http://www.open-group.org/onlinepubs/007908799/xsh/threads.html

Ritratto di paolo
paolo
(Webmaster)
Offline
Webmaster
Iscritto: 04/10/2004
Messaggi: 1260

mcortese ha scritto:

POSIX definisce un'API standard per la gestione dei thread. Questa API si traduce in una serie di funzioni usabili in vari linguaggi. Per quanto riguarda il C++ non ho idea, ma vuoi partire dal C, prova man pthread (pthread è il nome dell'implementazione GNU dei thread POSIX).

Un programma multithread è un singolo processo (quindi con un unico codice e un unico spazio di memoria) all'interno del quale più funzioni vengono schedulate indipendentemente. In pratica, ad un certo punto del tuo programma chiami pthread_create(funzione, args) e nasce un nuovo thread che non fa altro che eseguire funzione(args) in parallelo.

La differenza rispetto a fork() è che il nuovo thread condivide con il processo che l'ha creato molte risorse (la memoria, i file aperti, ecc.). Questo rende più facile lo scambio di dati tra thread, ma obbliga a usare tecniche di sincronizzazione per evitare che due thread scrivano contemporaneamente sulla stessa risorsa.

Per saperne di più: http://www.open-group.org/onlinepubs/007908799/xsh/threads.html

Non fa una piega. Smile

Aggiungo questo: The C Programming Language

UN libro che non puo' mancare nella libreria di qualsiasi sviluppatore Smile

Paolo Mainardi
CTO Twinbit http://www.twinbit.it
Vice Presidente -- ILDN - Italian Linux DIstro Network

Ritratto di bred
bred
(Junior)
Offline
Junior
Iscritto: 22/12/2010
Messaggi: 23

Stobby ha scritto:

1) Come la programmazione single thread può essere ricondotta ad uno standard da cui sono state derivate versioni dipendenti dal sistema operativo (standard ANSI) esiste uno standard, almeno "concettuale" per il multithreading o è tutto dipendente dal sistema operativo?

2) Il programma multithread è un software che esegue copie "complete" di se stesso di cui sono eseguite solo funzioni particolari oppure fisicamente esegue solo parti di codice?

3) Quando si parla di ambiente di esecuzione dei thread, cosa si intende?

1)
Lo standard sotto unix sono i pthread.
Inoltre esiste pure openmp che è standard, ma nella pratica si tratta di un insieme di direttive di compilazione non molto leggibili.
Io raccomanderei di usare le librerie Intel TBB, non sono standard ma sono ben fatte.

2)
Il prog multithread esegue in parallelo diverse funzioni, e se hai due o più core queste verranno estese sui vari core.
Non esegue copie complete di se stesso ma solo della funzione da eseguire in parallelo.

3)
Cosa intendi di preciso, ma penso che si riferisca al problema della condivisione delle variabili e delle risorse fra diversi thread.

Ritratto di Stobby
Stobby
(Junior)
Offline
Junior
Iscritto: 19/12/2010
Messaggi: 13

Bhé... che dire... grazie mille per le risposte!

Adesso non mi resta che provare a scrivere qualche cosa per cominciare a prendere dimestichezza con tutto..

Una domanda: a differenza di pthread, cosa comporta l'utilizzo del fork?

Ritratto di bred
bred
(Junior)
Offline
Junior
Iscritto: 22/12/2010
Messaggi: 23

Stobby ha scritto:

Bhé... che dire... grazie mille per le risposte!

Adesso non mi resta che provare a scrivere qualche cosa per cominciare a prendere dimestichezza con tutto..

Una domanda: a differenza di pthread, cosa comporta l'utilizzo del fork?

Il fork genera un processo completamente nuovo, è come lanciare due volte lo stesso programma.

Nb. Anche nelle boost libs, che sono quasi standard col c++, ci sono delle classi dedicate al multithreading.

Se vuoi qualcosa di semplice ed efficace prova a guardare pure le Qt.

Ritratto di Stobby
Stobby
(Junior)
Offline
Junior
Iscritto: 19/12/2010
Messaggi: 13

Processo nuovo con Handle e memoria non condivisa con il padre, giusto?

Ritratto di bred
bred
(Junior)
Offline
Junior
Iscritto: 22/12/2010
Messaggi: 23

Stobby ha scritto:

Processo nuovo con Handle e memoria non condivisa con il padre, giusto?

Adesso non ricordo esattamente com'è la funzione posix, poi quel Handle mi ricorda il mondo windows.

Comunque il fork genera un processo figlio fotocopia con variabili non condivise, ed eredita lo stato del padre al momento del fork.

Ritratto di Stobby
Stobby
(Junior)
Offline
Junior
Iscritto: 19/12/2010
Messaggi: 13

Handle è il mondo Windows (x lavoro sviluppo sotto Windows sofware di collaudo), in ogni caso, al di là della terminologia quello che mi interessava capire era se le variabili e/o i descrittori dei file sono condivisi tra padre e figlio.

Ora mi dedicherò alla lettura Smile

Ciao e grazie a tutti!!

Ritratto di Stobby
Stobby
(Junior)
Offline
Junior
Iscritto: 19/12/2010
Messaggi: 13

Scusate... altra domanda...
ma OpenMP e POSIX sono modi diversi di raggiungere lo stesso scopo, giusto?
Ragionando a basso livello (con la testa dello sviluppatore di firmware), le possibilità di parallelismo dipendono dal sistema operativo, e pertanto, tralasciando i discorsi che si possono fare in merito a portabilità ed efficienza, POSIX e OpenMP a basso livello si avvarranno delle stesse funzionalità dell'OS, giusto?