PDA

View Full Version : C++ e thread


Garet Jax
16-04-2005, 17:00
Scusate, in C++ è possibile la programmazione multithread?

Chiedo perdono in anticipo se ho sparato una cazzata.... :fagiano: ;)

71104
16-04-2005, 20:05
Scusate, in C++ è possibile la programmazione multithread?

Chiedo perdono in anticipo se ho sparato una cazzata.... :fagiano: ;)

mi chiedo come tu possa aver sentito parlare di multithreading se fai questa domanda... :confused:

cmq ci credi se ti dico che la risposta è no? ah no, non ci credi? e fai bene, perché è una balla! :D :sofico:

CERTO CHE E' POSSIBILE!!! IL MULTITHREADING NASCE SU UNIX A BASE DI C!!! :read:

Garet Jax
17-04-2005, 10:41
Perfetto!

Dove posso reperire maggiori informazioni?

71104
17-04-2005, 14:15
Perfetto!
Dove posso reperire maggiori informazioni?

-_- su una qualsiasi documentazione dei linguaggi C e C++! un po' di iniziativa, suvvia!! il linguaggio è AMPIAMENTE documentato, ce n'è una documentazione persino in MSDN!! googla un po' e troverai quello che cerchi; in particolare mi sembra che per creare un nuovo thread in C standard dovevi usare la funzione beginthreadex...

Mixmar
17-04-2005, 15:10
Mi permetto di aggiungere che, oltre a conoscere il linguaggio di programmazione che vuoi usare per programmare il multithreading, dovresti anche conoscere il sistema operativo su cui vuoi utilizzarlo e il modo in cui lui lo implementa!

Garet Jax
17-04-2005, 16:30
:eek:

cionci
18-04-2005, 00:46
A parte alcune librerie portabili, ogni sistema operativo ha il suo modo di operare con i thread...

Pilucchino
18-04-2005, 08:12
Se non e' indispensabile l'uso di C++ (e/o hai intenzione di lavorare su piattaforme diverse), dai un'occhiata ad un manuale di Java, che offre un supporto al multithreading integrato nel linguaggio.

Garet Jax
18-04-2005, 11:35
Purtroppo Java non lo posso usare... :cry:

Mi spiego meglio:
sto eseguendo un lavoro di test con Matlab. Il lavoro consiste in due parti principali: la prima riguarda il lavoro di test vero e proprio, la seconda deve salvare i dati su disco.
Dato che si tratta di moli abbastanza consistenti di dati, ho pensato che sarebbe utile dividere i due compiti, in modo da proseguire i test mentre il thread salva i dati su disco.
Il fatto è che la versione di Matlab (ver 6) di cui sono in possesso NON è in grado di importare classi java "ad hoc" (se qualcuno ne sa di più mi illumini, dato che io ho a disposizione la guida di Matlab 7, che dispone di comandi aggiuntivi rispetto alla 6). Di conseguenza, parlando con un utente americano iscritto al forum dedicato a Matlab, mi è stato consigliato di far partire una seconda istanza di matlab con con in esecuzione le funzioni che riguardano la seconda fase di lavoro. Il comando da usare (di win xp) è "start /B /belownormal matlab -r funzione.m"; secondo l'help di win riguardo il comando start.
Il difetto principale di questa soluzione è che mi parte Matlab come nuovo processo e con interfaccia grafica: cioè troppo oneroso.
Ne apporifitto per dire che se qualcuno ha qualche suggerimento può postare in questa discussione (http://forum.hwupgrade.it/showthread.php?t=922893) .
Traendo le dovute conclusioni, sono arrivato a questo lampo di genio, visto che Matlab e C(C++) vanno molto d'accordo (almeno, sempre secondo la guida in mio possesso), perchè non provare a risolvere il mio problema usando C++?
Problema: io i thread li ho trattati con Java, e non con C++, quindi sono a zero. Da qui la domanda: Ci sarannno i thread in C++ o sono possibili solo processi? Se si, come si dichiara/istanzia un thread in C++? etc.
Ribadisco che è mia intenzione documentarmi su questo argomento, ma riconosco la mole di informazioni al riguardo per cui partendo da zero ho chiesto, e sto chiedendo, un quid di indirizzamento sull'argomento stesso.
Ritengo utile quest'ultima precisazione, dato che mi è sembrato di capire che nei post precedenti mi sia stata accollata l'etichetta di "fannullone" o di colui che non si scomoda (vedi 71104, a cui ricordo che sono venuto a conoscenza del concetto di thread con il linguaggio Java).

Chiedo venia se mi sono dilungato troppo, ma a questo punto ho ritenuto necessario essere il più chiaro possibile.
Ringrazio anticipatamente chiunque avesse suggerimenti da propormi.

cionci
18-04-2005, 13:44
Io credo che per te la soluzione migliore sia di creare due processi (uno per ogni Matlab, non puoi fare altrimenti, non puoi far girare Matlab in un thread) e modificare la priorità di uno dei due processi in modo che sia più bassa della priorità normale...

Garet Jax
18-04-2005, 20:14
la mia idea è quella di creare un thread a cui vengono passati come parametri alcune variabili di matlab.
Più processi matlab sono troppo onerosi in termini di risorse. Tra l'altro non riesco a farlo partire in background (il comando di win "start /b" non va)

cionci
19-04-2005, 06:51
Allora credo che lunico modo sia richiamare Matlab dal C o C++ tramite le librerie (che trovi nell'installazione)... Comunque credo che vengano creati comunque due processi...

Garet Jax
23-04-2005, 13:42
chiamare Matlab da C?

io dovrei fare il contrario, provo a guardare cosa mi dice la guida di Matlab.

fabriziolivorno40
05-06-2005, 13:07
sito manuale C++ italiano

http://www.risorsehitech.it/informatica/guide/cplusplus_panoramica/



sito per scaricare compilatore dev C++ 4.9.8.0 compila anche in C

http://www.diiga.univpm.it/zingaretti/teaching/Fondamenti_di_Informatica/DEVCPP/devcpp.html


se non vi viene in italaino rina.dipietro@aliceposta.it

vi spediro il file di traduzione per l'italiano



sito manuale utente dev C++ 4.9.8.0 ita

http://www-db.deis.unibo.it/~csartori/didattica/informatica/DevC++_ManualeUtente.pdf





una volta avviato il programma dal menu file sciegliete nuovo
e cliccate su progetto scegliete console application premete ok vi si apre una finestra dove dovete scegliere dove destinare il vostro progetto quindi dal menu salva scegliete! io scelgo in genere documenti creo una nuova cartella nominandola progetto dev C++ salvate e vi apparira un programma gia compilato che pero dovete cancellare obligatoriamente per inserirvi il vostro codice ecco un codice da inserire per testare il compilatore fatelo perche è obligatorio altrimenti potrebbe dare degli erori cosi fece a me il trucco è inserire il sequente codice e compilarlo f9 salvate nella cartella che avete scelto come destinazione

per chiarimenti (rina.dipietro@aliceposta.ir)



#include <iostream>
#include <string>

int main()
{
using namespace std;

string responso;

cout << "premi invio e scrivi ";
cin >> responso;

system("PAUSE");
return 0;
}

--------------------------------------------------------------------------------

vBulletin v3.0.7, Copyright ©2000-2005, Jelsoft Enterprises Ltd.

cionci
05-06-2005, 14:23
Non capisco perchè tu stia postando questi link da ogni parte :eek:

Fenomeno85
05-06-2005, 16:17
Non capisco perchè tu stia postando questi link da ogni parte :eek:

avrà imparato a memoria sta cosa :boh:

domanda stupida usare degli script o function creati con matlab non ti può bastare?


~§~ Sempre E Solo Lei ~§~

Garet Jax
05-06-2005, 22:30
sito manuale C++ italiano

http://www.risorsehitech.it/informatica/guide/cplusplus_panoramica/



sito per scaricare compilatore dev C++ 4.9.8.0 compila anche in C

http://www.diiga.univpm.it/zingaretti/teaching/Fondamenti_di_Informatica/DEVCPP/devcpp.html


se non vi viene in italaino rina.dipietro@aliceposta.it

vi spediro il file di traduzione per l'italiano



sito manuale utente dev C++ 4.9.8.0 ita

http://www-db.deis.unibo.it/~csartori/didattica/informatica/DevC++_ManualeUtente.pdf





una volta avviato il programma dal menu file sciegliete nuovo
e cliccate su progetto scegliete console application premete ok vi si apre una finestra dove dovete scegliere dove destinare il vostro progetto quindi dal menu salva scegliete! io scelgo in genere documenti creo una nuova cartella nominandola progetto dev C++ salvate e vi apparira un programma gia compilato che pero dovete cancellare obligatoriamente per inserirvi il vostro codice ecco un codice da inserire per testare il compilatore fatelo perche è obligatorio altrimenti potrebbe dare degli erori cosi fece a me il trucco è inserire il sequente codice e compilarlo f9 salvate nella cartella che avete scelto come destinazione

per chiarimenti (rina.dipietro@aliceposta.ir)



#include <iostream>
#include <string>

int main()
{
using namespace std;

string responso;

cout << "premi invio e scrivi ";
cin >> responso;

system("PAUSE");
return 0;
}

--------------------------------------------------------------------------------

vBulletin v3.0.7, Copyright ©2000-2005, Jelsoft Enterprises Ltd.


???

avrà imparato a memoria sta cosa

domanda stupida usare degli script o function creati con matlab non ti può bastare?


Ho bisogno di far girare (minimo) due function in parallelo, una specie di multithreading.
A quanto mi risulta Matlab 6 non ha questa possibilità. quindi l'alternativa che mi è venuta in mente era quella di richiamare un prg C++ da eseguire in parallelo a Matlab.

cionci
05-06-2005, 22:38
Come avevo scritto sopra puoi fare l'inverso... Da un programma C puoi richiamare l'interprete Matlab... Facendolo in due thread diversi dovresti risolvere il problema...

71104
06-06-2005, 00:38
Non capisco perchè tu stia postando questi link da ogni parte :eek:
ma come, non lo sai?

sito manuale C++ italiano
http://www.risorsehitech.it/informa...lus_panoramica/

sito per scaricare compilatore dev C++ 4.9.8.0 compila anche in C
http://www.diiga.univpm.it/zingaret...CPP/devcpp.html

se non vi viene in italaino rina.dipietro@aliceposta.it
vi spediro il file di traduzione per l'italiano

sito manuale utente dev C++ 4.9.8.0 ita
http://www-db.deis.unibo.it/~csarto...nualeUtente.pdf


:D

Fenomeno85
06-06-2005, 19:09
ma come, non lo sai?

sito manuale C++ italiano
http://www.risorsehitech.it/informa...lus_panoramica/

sito per scaricare compilatore dev C++ 4.9.8.0 compila anche in C
http://www.diiga.univpm.it/zingaret...CPP/devcpp.html

se non vi viene in italaino rina.dipietro@aliceposta.it
vi spediro il file di traduzione per l'italiano

sito manuale utente dev C++ 4.9.8.0 ita
http://www-db.deis.unibo.it/~csarto...nualeUtente.pdf


:D


71104 calma che ormai il caldo ci sta dando alla testa ;)

~§~ Sempre E Solo Lei ~§~

71104
06-06-2005, 19:49
71104 calma che ormai il caldo ci sta dando alla testa ;)

~§~ Sempre E Solo Lei ~§~
sito manuale C++ italiano
http://www.risorsehitech.it/informa...lus_panoramica/

sito per scaricare compilatore dev C++ 4.9.8.0 compila anche in C
http://www.diiga.univpm.it/zingaret...CPP/devcpp.html

se non vi viene in italaino rina.dipietro@aliceposta.it
vi spediro il file di traduzione per l'italiano

sito manuale utente dev C++ 4.9.8.0 ita
http://www-db.deis.unibo.it/~csarto...nualeUtente.pdf


:)

BountyKiller
10-06-2005, 15:45
eccoti un esempio mongolo ma semplice che ho fatto io pochi minuti fa:
#include <iostream.h>
#include <windows.h>



DWORD IdentificativoThread1,IdentificativoThread2;
HANDLE semaforo = CreateMutex(NULL,false,NULL);
int conteggio = 0;


DWORD WINAPI FunzioneDelThread1(PVOID x)
{
for(int y = 0;y<10; y++)
{
WaitForSingleObject(semaforo, INFINITE);
cout<<"thread1 ha chiamato la wait"<<endl;
cout<<"l'id del thread1 e':"<<IdentificativoThread1<<endl;
conteggio++;
cout<<"thread1 sta per rilasciare il semaforo"<<endl;
ReleaseMutex(semaforo);
}
return 0;
}

DWORD WINAPI FunzioneDelThread2(PVOID x)
{
for(int y = 0;y<10;y++)
{
WaitForSingleObject(semaforo,INFINITE);
cout<<"thread2 ha chiamato la wait"<<endl;
cout<<"l'id del thread2 e':"<<IdentificativoThread2<<endl;
cout<<"thread2 sta per rilasciare il semaforo"<<endl;
ReleaseMutex(semaforo);
conteggio++;
}
return 0;
}


int main ()
{
int i = 0;
HANDLE hThread1 = CreateThread(NULL,0,FunzioneDelThread1,0,0,&IdentificativoThread1);
HANDLE hThread2 = CreateThread(NULL,0,FunzioneDelThread2,0,0,&IdentificativoThread2);
while(conteggio != 20)
{
i++;
}
system("pause");
}

compila con dev-c++.
ciao! :)

DomusP45
24-02-2013, 10:58
qualcuno sa consigliarmi un testo o un manuale fatto bene per imparare la programmazione multithread?

nico159
27-02-2013, 15:09
qualcuno sa consigliarmi un testo o un manuale fatto bene per imparare la programmazione multithread?
Su Windows il migliore sull'argomento è:
http://www.amazon.com/Concurrent-Programming-Windows-Joe-Duffy/dp/032143482X
Scritto direttamente da chi ha creato l'estensione TPL per .Net all'interno di Microsoft

Tratta sia Win32 che .Net

marco.r
27-02-2013, 15:48
Perché un thread del 2005??? Perché???
Non avendo ancora i rudimenti della programmazione multithreading non ha potuto creare un thread nuovo.

DomusP45
20-03-2013, 16:24
Su Windows il migliore sull'argomento è:
http://www.amazon.com/Concurrent-Programming-Windows-Joe-Duffy/dp/032143482X
Scritto direttamente da chi ha creato l'estensione TPL per .Net all'interno di Microsoft

Tratta sia Win32 che .Net

grazie mille nico...ora vedo un pò di vedere come posso averlo...

DomusP45
19-04-2013, 21:04
ragazzi, chiedo qui sperando di avere una risposta.

Ho trovato le POSIX per win32...visto che devo avere a che fare coi thread in visual studio.

http://sourceware.org/pthreads-win32/

solo che non so come usarle e non trovo una guida che mi dica come installarla...qualcuno sa aiutarmi??:muro: :muro:

tomminno
20-04-2013, 17:15
ragazzi, chiedo qui sperando di avere una risposta.

Ho trovato le POSIX per win32...visto che devo avere a che fare coi thread in visual studio.

http://sourceware.org/pthreads-win32/

solo che non so come usarle e non trovo una guida che mi dica come installarla...qualcuno sa aiutarmi??:muro: :muro:

Necroposting a parte, se devi avere a che fare con Visual Studio che te ne fai di pthreads?
In ogni caso non devi installare niente devi solo referenziarla nel tuo progetto come una qualunque altra libreria...

Infine già che stiamo parlando di C++ e se stai usando VS2012, adesso i thread fanno parte dello standard pertanto potresti evitare di usare altre librerie.

DomusP45
20-04-2013, 20:49
Necroposting a parte, se devi avere a che fare con Visual Studio che te ne fai di pthreads?
In ogni caso non devi installare niente devi solo referenziarla nel tuo progetto come una qualunque altra libreria...

Infine già che stiamo parlando di C++ e se stai usando VS2012, adesso i thread fanno parte dello standard pertanto potresti evitare di usare altre librerie.

Spiegati meglio...cosa dovrei usare?

io ho visual studio 2010 comunque.

marco.r
20-04-2013, 23:52
Se ricordo bene basta lanciare l'eseguibile per installarli...
poi devi referenziarli all'interno del progetto ed averli nel path quando esegui il programma, come si fa con qualsiasi altra libreria.
In ogni caso se vuoi essere cross platform e non usi un compilatore c++ molto recente, piuttosto usa boost::thread che e' piu' indicato (molto simile come interfaccia al nuovo standard), anche se piu' difficile da installare.

Tommo
21-04-2013, 04:01
Io uso POCO (http://pocoproject.org/) per il threading, perchè è piuttosto sano di mente (a esserlo più di boost ci vuole poco :D ) & crossplatform e somiglia a una delle poche parti di Java che trovo fatte bene :asd:
Altrimenti anche tinythread (http://tinythreadpp.bitsnbites.eu/) mi dicono che è carina.

Sennò, se ti senti cutting-edge c'è std::thread di C++11 che se è supportato dal tuo compilatore, è molto simile sia a tinythread che a boost (o viceversa).

PS: epic necro is epic

DomusP45
21-04-2013, 12:42
Ringraziando tutti per le info e la disponibilità, vado a riportarvi la mia situazione, così per chiarire le idee.

Devo usare visual studio 2010, ambiente C++, e lavorare con OpenCV (binarizzazione di immagini, silouette e quant'altro).

Ora, mi serve di avere un tot di thread che lavorano tra loro, del tipo
1° thread acquisisce le immagini, il secondo le elabora e passa il risultato ad un 3° e così via...

Mi hanno detto "usa pthread" ma io mi ricordavo che con windows non era "nativa"...così ho cercato quelle...ora ho anche capito come includere, dove mettere i file dll e così via...per farmi risultare in ambiente "pthread.h"...

Però, per quello che mi avete scritto, si può usare qualcosa di migliore è più recente...tipo le POCO o tinythreads...

alla luce di quello che vi ho detto che devo fare, quale mi conviene secondo voi? Per avere un tot numero di threads che lavorano su buffer di immagini e quant'altro?

Insomma, io pthreads la conosco, i join e quant'altro...le POCO e tinythreads no...e nemmeno le boost...cosa è incluso nell'ambiente visual studio ultimate 2010?

Scusate se insisto, ma prima di avviarmi vorrei avere chiaro quale strumento mi conviene, dovendolo comunque studiare da zero, visto che non lo conosco...pertanto, ringraziandovi ancora per l'attenzione, aspetto ulteriori delucidazioni :)

Io devo lavorare in windows, visual c++ 2010 e openCV installato (v2.4.4)...cosa mi conviene usare che sia intuitiva e semplice per avere una gestione dei thread in un programma C++?

Grazie mille anticipatamente.

Tommo
21-04-2013, 19:35
Onestamente non ti ci dovrebbe volere più di un'ora a leggertele tutte e capire le differenze e scegliertene una, i concetti di base sono gli stessi (thread, mutex, semaphore, conditions, qualcuna c'ha anche i task).

se ci metti così tanto a prenderne una e capire come si compila e si fa partire un thread, probabilmente "studiartele da zero" tutte quante e poi scegliere è un esercizio che dovresti fare :D

PS: tutte le alternative usano i thead di sistema e sono tutte adeguate a fare quello che ti serve, e sono tutte veloci uguale.
PPS: l'unica che è "parte di Visual Studio" (sbagliatissimo da dire visto che al massimo è inclusa in C++11) è std::thread, ma ti serve un compilatore che supporta C++11.

nico159
21-04-2013, 21:01
Ringraziando tutti per le info e la disponibilità, vado a riportarvi la mia situazione, così per chiarire le idee.

Devo usare visual studio 2010, ambiente C++, e lavorare con OpenCV (binarizzazione di immagini, silouette e quant'altro).

Ora, mi serve di avere un tot di thread che lavorano tra loro, del tipo
1° thread acquisisce le immagini, il secondo le elabora e passa il risultato ad un 3° e così via...

Mi hanno detto "usa pthread" ma io mi ricordavo che con windows non era "nativa"...così ho cercato quelle...ora ho anche capito come includere, dove mettere i file dll e così via...per farmi risultare in ambiente "pthread.h"...

Però, per quello che mi avete scritto, si può usare qualcosa di migliore è più recente...tipo le POCO o tinythreads...

alla luce di quello che vi ho detto che devo fare, quale mi conviene secondo voi? Per avere un tot numero di threads che lavorano su buffer di immagini e quant'altro?

Insomma, io pthreads la conosco, i join e quant'altro...le POCO e tinythreads no...e nemmeno le boost...cosa è incluso nell'ambiente visual studio ultimate 2010?

Scusate se insisto, ma prima di avviarmi vorrei avere chiaro quale strumento mi conviene, dovendolo comunque studiare da zero, visto che non lo conosco...pertanto, ringraziandovi ancora per l'attenzione, aspetto ulteriori delucidazioni :)

Io devo lavorare in windows, visual c++ 2010 e openCV installato (v2.4.4)...cosa mi conviene usare che sia intuitiva e semplice per avere una gestione dei thread in un programma C++?

Grazie mille anticipatamente.
VS mette a disposizione direttamente le api dell'OS per il multi threading
Queste api documentate nel libro http://www.amazon.com/Concurrent-Programming-Windows-Joe-Duffy/dp/032143482X sono la maniera più completa possibile per ottenere il massimo dai vari core/cpu della tua workstation
Il contro è:
Sono api C style e sono più complesse da utilizzare perchè ti espongono in maniera completa le tantissime possibilità che offre Windows come OS

Le alternative come Boost sono meno potenti ma decisamente più facili da utilizzare, e permettono in futuro di portare il tuo codice anche fuori da Windows

Se non ti serve tutta la potenza (e la complessità) che offrono le api native di Windows, puoi usare altro

Cosa altro? Scegliti un libro e usa quello scelto dall'autore
Ti sconsiglio di iniziare la programmazione multi threading pensando che "avvio qua, metto un lock qua" sia il giusto approccio

DomusP45
21-04-2013, 21:29
Siete stati molto eloquenti..penso di averci capito qualcosa in più. Domani mi spulcio le tiny e poco...e comincio a fare prove..grazie a tutti.