2010-10-08 19 views

risposta

19

Potrebbero esserci altre cose che si intendono in altri contesti, ma nei casi in cui ho lavorato in passato, "thread libero" significa che funziona, o almeno può funzionare, attraverso thread diversi senza alcun marshalling tra gli appartamenti.

L'apartment-threading in contrasto blocca diversi "appartamenti" con copie separate di dati "globali" (che quindi non è realmente globale, se ci pensate) e consente ad un solo thread di operare nell'appartamento, o ne consente diversi ma che saranno comunque separati da quelli che utilizzano altri appartamenti.

Ora, poiché il modello di apartment offre alcuni problemi di sicurezza dei thread, alcuni (ma non tutti) dubbi sulla sicurezza dei thread vanno via. Un pezzo di codice progettato per funzionare in un modello di appartamento sarà sicuro per i thread, ma parte o tutta la sicurezza del thread proviene dal modello di appartamento.

Un codice di thread gratuito deve fornire tutte le garanzie di qualsiasi livello di sicurezza del thread che si sta rivendicando.

Ciò significa che praticamente significa la stessa cosa di thread-safe, per qualsiasi scopo e scopo in cui non è necessario considerare la sicurezza del thread dell'utilizzo del codice del modello di appartamento.

+4

Ah! E COM sta facendo un uso pesante di questa idea di "appartamento". Mi sono appena reso conto che ogni volta che mi sono imbattuto in "free-threaded" (DirectX per esempio), c'era COM coinvolta. Il termine non è probabilmente usato elsewere. Finché le mie cose non riguardano la COM, userò semplicemente "thread-safe". Molte grazie! – Stefan

+2

Sì, lo so da quando lavoravo con COM. –

12

Ho appena fatto alcune ricerche su cosa "free-threaded" potrebbe significare, e ho anche finito con COM. Permettetemi di citare innanzitutto due passaggi dell'edizione 1998 del libro Don Box Essential COM. (Il libro contiene in realtà più sezioni sul modello di threading Free, ma lascio a quel per ora.)


Un thread esegue esattamente un appartamento alla volta. Prima che un thread possa usare COM, deve prima entrare in un appartamento. [& hellip;] COM definisce due tipi di appartamenti: appartamenti con multithreading (MTA) e singlethreaded apartments (STAs). Ogni processo ha al massimo un MTA; tuttavia, un processo può contenere più STA. Come suggerisce il loro nome, thread multipli possono essere eseguiti contemporaneamente in un MTA, mentre un solo thread può essere eseguito in uno STA. [& hellip;]

— da pagine 200-201. (Il corsivo è da me.)


Ogni CLSID in una DLL può avere una propria distinta ThreadingModel. [& Hellip;]

  • ThreadingModel="Both" indica che la classe può eseguire sia un MTA o STA.
  • ThreadingModel="Free" indica che la classe può essere eseguita solo in un MTA.
  • ThreadingModel="Apartment" indica che la classe può essere eseguita solo in uno STA.
  • L'assenza di un valore ThreadingModel implica che la classe può essere eseguita solo sullo STA principale. Lo STA principale è definito come il primo STA da inizializzare nel processo.

— da pagina 204. (formattazione e l'enfasi aggiunto da me.)


prendo questo significa che un componente (classe) che viene dichiarata come piste free-threaded in un MTA, in cui è possibile la concorrenza di più thread e le chiamate al componente da thread diversi sono esplicitamente consentite; vale a dire. un componente a thread libero supporta un ambiente con multithreading. Dovrebbe ovviamente essere sicuro per il thread al fine di raggiungere questo obiettivo.

L'opposto sarebbe un componente progettato per uno STA, vale a dire. consente solo le chiamate da un determinato thread. Una classe di questo tipo non dovrebbe essere thread-safe (poiché COM si prenderà cura che nessun altro thread di quello che "ha inserito"/impostato lo STA possa utilizzare il componente in primo luogo, cioè, COM protegge il componente da accesso concorrente).

Conclusione: Il termine COM "a thread libero" in sostanza sembra avere le stesse implicazioni del termine più generale "thread-safe".


P.S .: Questa risposta presuppone che "thread-safe" sostanzialmente significa qualcosa come "può trattare con accessi concorrenti (possibilmente di diversi fili)."

P.P.S .: Mi chiedo se "free-threaded" è l'opposto di "avere affinità di thread".