Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 19
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2001
    Messaggi
    577

    [c/c++] istanziare n thread

    come istanzio n thread di tipo produttore ed altrettanti di tipo consumatore ?

    grazie


    codice:
    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);
    
    }

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Usi la

    _beginthreadex

    http://msdn.microsoft.com/en-us/library/kdzttdcb(v=vs.80).aspx
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2001
    Messaggi
    577
    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.

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    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."
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    Mar 2001
    Messaggi
    577
    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


    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.

  6. #6
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    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.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  7. #7
    Utente di HTML.it
    Registrato dal
    Mar 2001
    Messaggi
    577
    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 ?

  8. #8
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    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()).
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  9. #9
    Utente di HTML.it
    Registrato dal
    Mar 2001
    Messaggi
    577
    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)

  10. #10
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    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.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.