2010-03-02 2 views
13

Se alloco memoria in un thread in C++ (sia nuovo o malloc) posso de-allocarlo in un altro, o entrambi devono verificarsi nel stesso thread? Idealmente, vorrei evitare questo, in primo luogo, ma sono curioso di sapere che è legale, illegale o dipendente dall'implementazione.Se alloco memoria in un thread in C++ posso de-allocarlo in un altro

Edit: I compilatori sono attualmente in uso comprendono VS2003, VS2008 ed Embedded C++ 4.0, rivolte XP, Vista, Windows 7 e varie versioni di Windows CE/PocketPC & Mobile. Quindi praticamente tutto Microsoft ma attraverso una serie di piattaforme esoteriche.

+2

I thread non sono affatto descritti nello standard C++. È tutto specifico di implementazione. – legends2k

+0

se si dice all'uso di un compilatore di streghe, di un sistema operativo che si sta utilizzando, è possibile che si ottengano ulteriori utili risponditori –

+0

Ian, compilatore e dettagli del sistema operativo aggiunti. –

risposta

17

Generalmente, malloc/new/free/delete su sistemi multi-thread sono thread-safe, quindi questo non dovrebbe essere un problema - e allocare in un thread, deallocare in un altro è una cosa abbastanza comune da fare.

Poiché i thread sono una funzionalità di implementazione, è certamente dipendente dall'implementazione - ad es. alcuni sistemi richiedono il collegamento con una libreria di runtime multi-thread.

+1

+1 - quasi una risposta perfetta. –

1

Siamo spiacenti per questa risposta inutile, ma C++ Standard non ha thread, quindi tutte le scommesse sono spente!

Tuttavia, alcuni compilatori C++ e sistemi di runtime supportano il threading, su questi spesso si deve dire al linker di utilizzare la versione thread-safe delle librerie standard.

2

Per poter allocare in un thread e liberare in un altro, è necessario che la libreria di runtime sia thread-safe. I runtime di Microsoft sono stati tutti thread-safe dal Visual Studio 2005, Visuals Studio 2003 fornisce sia runtime thread-thread e thread-safe - ovviamente, si dovrebbe scegliere di collegarsi con quelli multithread se si utilizza il threading.

Per quanto riguarda se è legale, illegale o implementazione dipendente, direi nessuno dei precedenti. E 'del tutto al di fuori della portata dello standard in quanto non menziona affatto il threading.

+0

Grazie Joe, vale la pena conoscere dato che abbiamo ancora qualche sviluppo seduto su VS2003. –

+0

VS2003 fornisce sia il multithreaded che il single threaded runtime: devi solo assicurarti di essere collegato a quelli giusti. –

1

Credo che sia stata definita l'implementazione dal momento che lo standard C++ non dice nulla su come i thread condivideranno lo spazio degli indirizzi.

0

che funziona perché le discussioni appartengono allo stesso processo e condividono lo stesso spazio di indirizzamento ..

6

Non c'è nulla di nuovo/si elimina che ti impediscono di allocare e deallocare in thread separati. Come molti hanno già detto, lo standard è silenzioso su multi-threading - non c'è né supporto per multi-threading, né c'è nulla che ti impedisce di farlo usando uno dei servizi standard. Questo è positivo e negativo in quanto puoi fare tutto ciò che vuoi, ma il linguaggio non fornisce alcun meccanismo diretto per aiutarti a farlo in sicurezza.

Tuttavia, ci sono molti potenziali problemi tecnici che potrebbe essere necessario affrontare. Molti compilatori hanno aromi multi-threaded e single-threaded delle librerie di runtime che implementano la nuova eliminazione &, quindi devi essere sicuro di usare quello giusto. (VS 2008 ha eliminato il CRT a thread singolo, quindi non è un problema.) Ancora più importante, il tuo software deve essere progettato da zero per essere informato su più thread e questa è la più grande sfida per noi. Le risorse devono essere protette, la proprietà deve essere chiara ed è necessario evitare le condizioni di stallo dello stallo &. Ma mentre questa è probabilmente la sfida più importante e difficile da affrontare quando si assegna e si deallocano in thread separati, non è direttamente correlata alla tua domanda, quindi la lascerò per un'altra discussione.

+0

Grazie per la risposta John. Ho mantenuto la domanda intenzionalmente ristretta perché sono consapevole che discutere le varie potenziali insidie ​​della scrittura di codice multi-thread richiederebbe un grosso libro. Dico che sono caduto in molte di queste fosse io stesso in più di un'occasione;) –

+0

È come giocare a un vecchio gioco di Activision, vero? –