|
|
|
![]() |
|
Strumenti |
![]() |
#261 | |
Senior Member
Iscritto dal: Nov 2002
Messaggi: 5845
|
Quote:
http://charm.cs.uiuc.edu/manuals/htm...++/manual.html Questa è Charm++ un'altra libreria spesso usata con i supercomputers che fa un pesante uso di threads. Leggendo il manuale, almeno per adesso, non ho visto relazioni con il message passing. Allora come fanno i threads a comunicare tra loro ? ![]() |
|
![]() |
![]() |
![]() |
#262 | |
Senior Member
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12103
|
Quote:
Se fai girare thread diversi in macchine che non condividono la stessa memoria (come ad esempio ogni macchina componente il cluster) allora devi ovviamente usare dei meccanismi di comunicazioni per scambiare i dati elaborati, siano essi meccanismi di messagge passing o ad esempio work units similari a quelle del folding@home (che, sinceramente, non ho idea su cosa siano basate). Su una macchina a memoria condivisa invece non hai alcuna necessità di scambiare i dati dato che i thread hanno completamente a disposizione tutta la memoria della macchina, al massimo potranno avere prestazioni un pò inferiori nel caso in cui i dati da elaborare si trovino nei moduli di memoria direttamente connessi agli altri processori, e quindi le latenze sarebbero + elevate (ovviamente tralasciando il distinguo tra bus point-to-point, come l'HT o bus condiviso, quale il classico FSB, e la presenza di dati modificati nella cache di un processore che ancora devono essere scritti nella memoria RAM).
__________________
![]() |
|
![]() |
![]() |
![]() |
#263 | |
Senior Member
Iscritto dal: Nov 2002
Messaggi: 5845
|
Quote:
![]() |
|
![]() |
![]() |
![]() |
#264 | |
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Quote:
![]() Specificata cosi', ogni programmatore Java sa gia quel che fare, e sa che telegram e' valido per ogni tipo di elaborazione che gli salta in mente. Ma... e' lo stesso per il programmatore C++? Assolutamente no! Telegram potrebbe essere una variabile locale, nel metodo di chiamata del dispatcher, giusto? Come fai a saperlo? Se non te lo dice qualcuno, NON LO PUOI SAPERE. A questo punto, aggiungo un tassello: ho ricevuto questo telegramma e lo devo, ovviamente, elaborare. L'elaborazione e' affidata ad un altro thread, per motivi di efficienza. Devo quindi fare una push dell'oggetto in una coda, il thread lo prelevera' e lo elaborera'. Sei costretto, in C++, a fare una copia! ![]() Altrimenti, potrebbe essere che sei efficiente ma, sorry, vai in crash ![]() Java ovviamente non fara' alcuna copia, tirera' dritto e saremo tutti sicuri che funziona correttamente. In C++ non potrai essere sicuro, ed avrai anche paura di generare dei leak!
__________________
In God we trust; all others bring data |
|
![]() |
![]() |
![]() |
#265 | ||
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
![]() Quote:
Comunque stai ricadendo nuovamente sul garbage collector...se io uso un garbage collector in C++ posso copiare quanti riferimenti voglio ![]() |
||
![]() |
![]() |
![]() |
#266 | |
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
In generale, quando si implementano queste architetture in C++ (beh, sono delle callback) i metodi sono del tipo:
Codice:
void messageGot (Telegram *telegram); Codice:
void messageGot (Telegram &telegram); Questo oggetto e' stato allocato per me: lo devo deallocare? Se non lo devo deallocare, chi lo dealloca? L'oggetto e' ancora valido al termine della MIA esecuzione? In pratica, come ho scritto nell'esempio che seguiva, posso scrivere: coda.push (telegram) oppure e' meglio infilarci una copia? Quote:
Esistono del garbage collector per C++ ma sono limitati, poiche' in C++ esiste un'algebra dei puntatori. Cmq se ci metti un garbage collector, allora siamo nel gruppo dei linguaggi "managed" ![]() [OT]Cionci: se pubblico un OT mi censuri? Certe volte ci sono notizie che vanno condivise ![]()
__________________
In God we trust; all others bring data |
|
![]() |
![]() |
![]() |
#267 | |||
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
Con il puntatore dipende dall'architettura che scegli di implementare. Quote:
Quote:
![]() |
|||
![]() |
![]() |
![]() |
#268 | ||||
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Quote:
Se vuoi usarlo fuori dal metodo devi farne una copia in una variabile locale. Cosa che in realtà dovrebbe essere bene fare altrimenti qualcuno dall'esterno della classe potrebbe modificare il contenuto di una variabile magari privata. Sai che bell'incapsulamento. Quote:
![]() Quote:
Con il codice: Codice:
coda.push (telegram); Quote:
I puntatori hanno tutti la stessa dimensione 32 o 64 bit a seconda dell'architettura, l'unica eccezione è per i puntatori a metodo che a seconda del compilatore possono arrivare ad occupare anche a 20 byte. Ultima modifica di tomminno : 03-01-2008 alle 21:39. |
||||
![]() |
![]() |
![]() |
#269 | |
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Quote:
Penso che non ci sia cosa peggiore in C++ che passare il riferimento di qualcosa allocato dinamicamente. Quello si che può portare ad errori a runtime difficilmente comprensibili. |
|
![]() |
![]() |
![]() |
#270 | |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
![]() |
|
![]() |
![]() |
![]() |
#271 |
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
E' una questione che mi incuriosisce da un po' e non ho mai avuto una risposta chiara: cosa si intende per linguaggio Managed ? Mi risulta che il termine sia stato coniato da Microsoft per indicare quei linguaggi che girano all'interno della framework .NET, ma vedo che e' spesso usato in contesti piu' generali. Ma allora che caratteristiche deve avere ? Avere un GC ? (Ma allora anche il C++ potrebbe esserlo), girare in una VM (quindi sarebbe da escludere Java compilato con gcj) ? Altro ?
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele |
![]() |
![]() |
![]() |
#272 | |
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Quote:
Ovvio che se vado a prendermi i puntatori di tali oggetti spesso vuol dire che sono in cerca di rogne...
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele |
|
![]() |
![]() |
![]() |
#273 | ||
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Quote:
Ergo: dovrai copiare i tuoi dati per evitare che ti spariscano da sotto il naso. No other chances! Quote:
![]() Ti riferisci al fatto che non mi censuri o che certe notizie non vadano condivise? ![]()
__________________
In God we trust; all others bring data |
||
![]() |
![]() |
![]() |
#274 | ||||
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Quote:
![]() Quote:
Quote:
![]() Quote:
Queste operazioni non ti permetteranno ti tener conto di tutti i puntatori che fanno riferimento allo stesso oggetto, in modo da deallocarlo automaticamente quando nessuno lo punta piu'. (i famosi "smart pointer" che usi quando programmi usando COM). E' un problema ben noto...
__________________
In God we trust; all others bring data |
||||
![]() |
![]() |
![]() |
#275 | |
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Quote:
![]() In questo caso allora non ha molto senso star li' a destreggiarsi in loop ciclopici... decidiamo un task un po' piu' complesso e vediamo come va a finire C++ vs. Java vs. resto del mondo. Sempre che abbia senso. Il web e' pieno di confronti simili. Che nella maggior parte dei casi hanno poco senso visto che spesso dettano anche come debbano essere scritti i programmi (vedi ad esempio il famoso shootout) e allora tanto vale.
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele |
|
![]() |
![]() |
![]() |
#276 | |
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Quote:
__________________
In God we trust; all others bring data |
|
![]() |
![]() |
![]() |
#277 | |
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Quote:
__________________
In God we trust; all others bring data |
|
![]() |
![]() |
![]() |
#278 | |
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Quote:
Se ci si gestisce la memoria da se' bisogna farlo con criterio, per cui quando chiami quel metodo dovresti gia' sapere se la proprieta' di quella memoria e' del chiamato, del chiamante e in tal caso se per una quantita' di tempo sufficiente a garantirne l'uso da parte del chiamato. Ovvio che se ogni metodo fa caso a parte si diventa matti...
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele |
|
![]() |
![]() |
![]() |
#279 | |
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Quote:
1 - c'e' un "dispatcher" che riceve dei telegrammi da dove vuole lui; 2 - se qualcuno ne vuole copia, implementa una interfaccia (o una funzione virtuale in C++) e si registra. Quando un nuovo telegramma arriva, viene automaticamente chiamata la messageGot() (e' sempre un esempio); 3 - la messageGot() deve elaborare il telegramma. Supponendo che debba fare diverse operazioni, si sia deciso di affidare le medesime ad un altro thread. Quindi la messageGot() sara' piu' o meno cosi': Codice:
void messageGot (Telegram *telegram) oppure void messageGot (Telegram &telegram) { // Metti in coda per elaborare taskQueue.push (telegram); } Quello che dicevo e' che C++ non puo' fare alcuna assunzione sulla validita' della variabile FUORI dalla messageGot (), pertanto in coda non avra' altra scelta che mettere un COPIA dell'oggetto, o un puntatore alla COPIA dell'oggetto, altrimenti il rischio e' quello di processare della fuffa. Java non ha questo problema. Questo e' sufficiente a far pendere l'ago delle prestazioni dalla parte di Java? Well, dipende da quanto e' pesante le copie che C++ e' obbligato a fare mentre Java puo' evitare. Scusami se non ho capito bene quello che intendevi dire. Cmq quello che voglio andare a sfatare e' l'assunto: - compilato = efficiente - interpretato = inefficiente Non ne sono per niente convinto, come non sono convinto dell'equazione - C++ = efficiente - Java = inefficiente Sono convinto che ci sono dei casi (e non proprio particolari) in cui queste equazioni si invertono. E sono convinto che in futuro le cose cambieranno ancora...
__________________
In God we trust; all others bring data |
|
![]() |
![]() |
![]() |
#280 | ||
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
La copia locale è sempre buona cosa, se devi riusare la variabile in altre parti della classe. Perchè significa che nessuno dall'esterno possa modificarne il contenuto a tua insaputa. Se condividi il riferimento con altre classi questo presupposto cade.
Quote:
Se qualcuno ti passa un puntatore e te lo copi solo come puntatore e chi te lo ha passato decide di deallocarlo sei nei guai. Stesso discorso per il chiamante che potrebbe vedersi deallocato il puntatore dal chiamato a sua insaputa. Generalmente nelle classi si include il costruttore di copia che prende in ingresso un riferimento const, io almeno non ho mai scritto la versione di copia per puntatori, magari sono poco previdente ![]() Quote:
Mai usato COM potrebbe essere un problema suo ![]() |
||
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 04:25.