Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Threads in Windows
Forum - C/C++ - Threads in Windows

Avatar
ShellC91 (Normal User)
Newbie


Messaggi: 15
Iscritto: 29/06/2010

Segnala al moderatore
Postato alle 13:41
Domenica, 04/07/2010
Salve a tutti mi chiedevo se usando la CreateThread di windows.h sia possibile lanciare un numero indefinito di threads a partire da una determinata funzione, e se è possibile come si potrebbe fare...

Mi spiego meglio:
Io ho questa "funzione" da lanciare come thread:

Codice sorgente - presumibilmente C/C++

  1. DWORD WINAPI Receive(LPVOID Parameter)
  2. {
  3.       SOCKET* cl_desc = Parameter;
  4.       while(1)
  5.       {
  6.         if(!ReceiveString(cl_desc)) break;
  7.       }
  8.       N_Threads--;
  9.       return 0;
  10. }



E devo aprire più di un thread (il numero è indefinito), in modo che ad ogni connessione venga aperto il thread che si occupa di ricevere le stringhe.

Posso passare semplicemente ogni volta il descrittore del socket richiamando sempre la stessa funzione in questo modo

Codice sorgente - presumibilmente Plain Text

  1. CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Receive,&sock_descriptor,0,&dwThreadId);



Oppure c'è un procedimento particolare??

Ringrazio tutti in anticipo, se mi sono spiegato male fatemelo sapere che mi spiego meglio.

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6402
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 14:09
Domenica, 04/07/2010
Non usare la CreateThread se utilizzi il runtime del C, perché potresti generare dei memory leak. Al suo posto utilizza la

_beginthreadex
http://msdn.microsoft.com/en-us/library/kdzttdcb(VS.80).aspx




Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
ShellC91 (Normal User)
Newbie


Messaggi: 15
Iscritto: 29/06/2010

Segnala al moderatore
Postato alle 14:12
Domenica, 04/07/2010
Ok grazie per il consiglio,
per quanto riguarda il lancio di più thread (numero indefinito) che usano la stessa porzione di codice (funzione) si può fare?

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6402
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 14:29
Domenica, 04/07/2010
Il numero dei thread è limitato dallo spazio dello stack (poco piu' di 2000 thread al massimo).

Per la seconda domanda, non ho capito bene il tuo problema ... forse un articolo da leggere ti puo' essere utile

Multithreading
http://msdn.microsoft.com/en-us/library/172d2hhw(v=VS.80). ...


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
ShellC91 (Normal User)
Newbie


Messaggi: 15
Iscritto: 29/06/2010

Segnala al moderatore
Postato alle 14:41
Domenica, 04/07/2010
Grazie, comunque il problema praticamente è questo: usando i socket io devo consentire al server di accettare OGNI connessione e passare il descrittore del client appena connesso a un thread che si occupi di ricevere i messaggi. E questo lo devo fare per tutti i client che si connettono.

Codice sorgente - presumibilmente C/C++

  1. ...
  2. while(1)
  3. {
  4.         sc = accept(ss,NULL,NULL);
  5.         CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Receive,&sc,0,&dwThreadId);
  6. }
  7. ...



Codice sorgente - presumibilmente C/C++

  1. DWORD WINAPI Receive(LPVOID Parameter)
  2. {
  3.       SOCKET* cl_desc = Parameter;
  4.       while(1)
  5.       {
  6.         if(!ReceiveString(cl_desc)) break;
  7.       }
  8.       N_Threads--;
  9.       return 0;
  10. }



E' fattibile una cosa del genere? Devo usare _beginthreadex ?
Grazie di tutto.

Ultima modifica effettuata da ShellC91 il 04/07/2010 alle 14:47
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6402
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 15:06
Domenica, 04/07/2010
1) Controlla il valore restituito dalla accept, perché potrebbe esserci un errore e il valore di sc non è valido ...

2) Non usare direttamente sc ma assegna il suo valore ad un nuovo elemento di un array di socket e passa il nuovo indice usato al nuovo thread

3) usa la _beginthreadex



Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
ShellC91 (Normal User)
Newbie


Messaggi: 15
Iscritto: 29/06/2010

Segnala al moderatore
Postato alle 15:12
Domenica, 04/07/2010
ok la 1 e la 3 chiarissime, farò così.
Per quanto riguarda la 2 dovrò comunque aprire un thread per ogni connessione?

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6402
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 15:25
Domenica, 04/07/2010
Che vuoi dire? Certo! E' questo l'oggetto di questa discussione ... o no?


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
ShellC91 (Normal User)
Newbie


Messaggi: 15
Iscritto: 29/06/2010

Segnala al moderatore
Postato alle 15:31
Domenica, 04/07/2010
Sì proprio quello! :)
Comunque ritornando a prima io praticamente prima di tutto controllo se l'accept ritorna un socket valido, quindi lo inserisco in un array (o una lista dinamica) e apro un nuovo thread passando la posizione nella lista o nell'array.

Ok grazie di tutto ho capito :k:

PM Quote