PDA

Visualizza la versione completa : [C++] Istanziare thread di tipo produttore e consumatore


misterx
18-07-2011, 22:38
come istanzio n thread di tipo produttore ed altrettanti di tipo consumatore ?

grazie



int array[100];

/* PRODUTTORE */

hMutex=CreateMutex(NULL, FALSE,NULL);
while(.....)
{
WaitForSingleObject(hMutex,INFINITE);

for(int i=0; i<100; i++)
array[i]=rand();

ReleaseMutex(hMutex);
Sleep(50);

}


/* CONSUMATORE */

hMutex=CreateMutex(NULL, FALSE,NULL);
while(.....)
{
WaitForSingleObject(hMutex,INFINITE);

for(int i=0; i<100; i++)
printf(%d\n,array[i]);

ReleaseMutex(hMutex);
Sleep(250);

}

oregon
18-07-2011, 22:56
Usi la

_beginthreadex

http://msdn.microsoft.com/en-us/library/kdzttdcb(v=vs.80).aspx

misterx
19-07-2011, 10:50
ciao,
io uso la CreateThread() e mi chiedevo se non è possibile creare un array contenente i riferimenti a tale funzione. Magari è una sparata m ano sono un esperto di questo genere di programmazione.

oregon
19-07-2011, 17:15
La domanda non mi è chiara ...

In ogni caso, non usare la CreateThread. Su MSDN c'è scritto

"A thread in an executable that calls the C run-time library (CRT) should use the _beginthreadex and _endthreadex functions for thread management rather than CreateThread and ExitThread; this requires the use of the multi-threaded version of the CRT. If a thread created using CreateThread calls the CRT, the CRT may terminate the process in low-memory conditions."

misterx
19-07-2011, 18:42
ciao,
non è chiaro leggendo se usando CreateThread stanno dicendo che si possono avere problemi di memori leak o altro


qui poi http://msdn.microsoft.com/en-us/library/hw264s73 sembra che dica che usando la _endthread non serve richiamare la CloseHandle in quanto è implicita nella endthread, ma nell'esempio del tuo link, nel secondo per l'esattezza, la richiama :spy:


ho poi letto anchw qui http://forum.html.it/forum/showthread/t-1375226.html e non mi è chiaro cosa intendete dire con:

Come ha quotato Oregon, i leaks ci sono se la CRT è singlethreaded. Usando (come si dovrebbe fare) beginthread e beginthreadex e compilando con la CRT singlethreaded si ha un errore di compilazione. Errore fatto apposta per ribadire che non si deve usare il mutithreading con la CRT singlethreading.

shodan
19-07-2011, 19:53
La CreateThread() non ha niente a che vedere con la CRT del C/C++, pertanto può essere invocata solo se si ha la granitica certezza di adoperare solo API Windows (che per natura sono MultiThreading).
Nello stesso thread (del forum) è spiegato anche il perché.
Usando _beginthreadex sei obbligato (da una direttiva di preprocessing impostata dall'ambiente) a usare la CRT MultiThreading.

misterx
19-07-2011, 20:24
Originariamente inviato da shodan
La CreateThread() non ha niente a che vedere con la CRT del C/C++, pertanto può essere invocata solo se si ha la granitica certezza di adoperare solo API Windows (che per natura sono MultiThreading).
Nello stesso thread (del forum) è spiegato anche il perché.
Usando _beginthreadex sei obbligato (da una direttiva di preprocessing impostata dall'ambiente) a usare la CRT MultiThreading.

quel "solo" sinceramente, mette un pò a disagio.
Io uso Borlan Builde C++ per sviluppare e quindi se nel mio thread uso una funzione del C standard come ad esempio la fprintf() in luogo della WriteFile() o la fopen() in luogo della CreteFile() potrei avere dei problemi ?

shodan
19-07-2011, 20:36
Dipende dalla CRT sottostante. Da quel che ricordo, la CRT del Borland (ora Embarcadero) è MultiThreaded, ma non è detto che i vari mutex interni siano inizializzati, senza usare gli appositi switch di compilazione per il multithreading che la presenza di _beginthreadex certifica.
Quindi se vuoi andare sul sicuro usa _beginthreadex (che tra l'altro è identica a CreateThread()).

misterx
19-07-2011, 20:42
io ho usato la CreateThread() per creare due thread e da profano non ho notato problemi. Unica cosa che ho notato avendo utilizzato anche un Mutex, è che windows gestisce i thread in maniera del tutto inaspettata: mettendo un contatore ho visto che esegue n volte il thread A prima di passare a quello B e/o viceversa; a cosa sia dovuta questa preferenza resta un mistero. Mi hanno consigliato allora di usare un Wait.....() ma a questo punto il tutto diverrebbe seriale e allora tanto vale creare due thread

Scusa ma di BCB conosco la VCL ma la CRT non so cosa sia (ops, ho letto: C runtime library)

shodan
19-07-2011, 21:00
I veri guai li scopri quando compili in modalità full release e lanci il programma fuori ambiente, e il comportamento in apparenza "assurdo" di windows scompare. Per esempio race condition su variabili condivise e deadlock possono verificarsi in release mode e non in debug mode.

Tra l'altro la VCL ha vari oggetti per gestire i thread (a iniziare da TThread se non ricordo male), ed è scritta in Pascal (che probabilmente ha meno paturnie del C/C++ sotto questo profilo). Se non hai necessità strane, ti consiglio di usare il framework del compilatore.

Per inciso, CRT significa C RunTime.

Loading