Newsgroup: it.comp.programmare.win32
Titolo: Multithreading

Ho intenzione di programmare un piccolo MUD, e mi interessa tenere separati
i diversi moduli, facendoli accedere però a dati comuni, e comunicare tra
loro.
Mi interessano 2 cose, in particolare:
1) Come posso fare in modo che parti diverse di un programma vengano
eseguite con thread separati, in modo da lavorare in contemporanea? Devono
potere mandare/ricevere messaggi agli altri thread, oltre che accedere agli
stessi dati (in particolare un coda).
2) Posso fare la stessa cosa, ma con veri e proprio programmi separati, dove
magari il principale coordina gli altri?
Grazie.
--
Marco Iannaccone
marc...@tin.it
Nick: Tolkien
ICQ UIN: 18748121
"This is a new ship, boy, but she's got the right name...
You treat her like a lady, and she'll always bring you home"
"Questa è una nave moderna, ma ha un nome antico e glorioso...
Trattala come una signora e ti riporterà sempre a casa"
FAQ di it.comp.lang.c:
http://www.programmazione.it/linguaggi/c/itcomplangc.htm
FAQ di it.comp.lang.c++:
http://www.programmazione.it/linguaggi/c/lang_faq.htm


Provo a rispondere:
Siccome hai scritto su questo newgroup, suppongo che tu voglia utilizzare
una piattaforma Windows, quindi direi che la soluzione ideale sia la prima.
Riguardo a come creare thread separati dovresti specificare quale linguaggio
vuoi utilizzare. In ogni caso, la gestione di più thread che collaborano
richiede delle conoscenze di multitasking che sarebbe impossibile spiegare
in delle semplici E-Mail. Se non si posseggono queste conoscenze la cosa
migliore è procurarsi un buon libro sull'argomento.
Spero di esserti stato d'aiuto,
Jeremi

Il linguaggio è il C++.
Comunque, non mi interessa sapere tanto come fare praticamente, ma cosa devo
utilizzare.
Mi interessano quindi i nomi delle API, e magari qualche link/libro
sull'argomento...
Sotto Linux, ci sono delle funzioni che permettono di assegnare funzioni a
task separati. Mi servirebbe qualcosa del genere...
Grazie


 task separati. Mi servirebbe qualcosa del genere...
L'API fondamentale e` CreateThread, che svolge appunto questo
compito, ma attenzione: almeno con VC++, va usata solo se la
funzione da eseguire nel thread separato NON fa alcun uso di
funzioni runtime standard C.  Per "avvertire" la libreria di
runtime e permetterne l'uso da parte del thread separato va
usata la funzione (CRT) _beginthreadex invece di CreateThread.
(Inoltre va usata una CRT abilitata al multi-threading, come
di solito sono quelle costruite per risiedere in DLL).
Poi naturalmente ci sono i problemi di sincronizzazione, mutua
esclusione, collaborazione fra i thread, ecc, ecc.  Oltre alle
tipiche primitive di Kernel le API di Win32 offrono un certo
numero di primitivissime a basso livello, MOLTO veloci se devi
vare cose molto semplici, tipo InterlockedIncrement da usare
invece di ++ per incrementare un long in modo thread-safe (si
usa direttamente la capacita` di "interlock" delle CPU Intel)
ovvero "atomico" che dir si voglia.
Alex

 sull'argomento...
Per quanto riguarda l'uso diretto delle API, questo è un'ottimo libro:
Thuan Q. Pham, Pankaj K. Garg, "Multithread Programming with Windows NT",
Prentice Hall, 1995
spiega non solo le funzioni, ma anche come si risolvono i problemi di
sincronizzazione. Poi c'e' sempre la possibilita' di ricorrere a qualche
framework come MFC, ma in tal caso dovrai procurarti un buon libro di
programmazione in MFC, controllando che tra gli argomenti trattati si dia
ampio spazio al multithreading. Alcuni libri di MFC per beginners non
sfiorano neanche l'argomento!
Una volta appreso i concetti fondamentali della programmazione multithread,
la libreria MSDN sara' probabilmente il tuo unico riferimento.
ciao,
Jeremi