Sono la stessa variabile o no? In altre parole, che cos'è loro linkage?
Se è esterno, quindi no. Se è interno, allora è OK a meno che le due definizioni non si verifichino entrambe nello stesso file.
Se non vi è alcun collegamento, non vi è alcun problema.
A meno che non abbia trascurato qualcosa, thread_local
non ha alcun impatto sul collegamento, quindi le normali regole si applicano (e la definizione della variabile thread_local
in una unità di traduzione e non in un'altra è una violazione della regola a una definizione).
Penso che ci sia un bug nello standard qui, tuttavia. Lo standard (§7.1.1/1) dice che "Se thread_local appare in una qualsiasi dichiarazione di una variabile, deve essere presente in tutte le dichiarazioni di quell'entità." Non esiste una dichiarazione esplicita che non sia necessaria una diagnostica o che la violazione di questa regola non sia definita, pertanto un compilatore è richiesto a a diagnosticare l'errore. Solo che, ovviamente, se si definisce in ambito namespace:
thread_local int i;
in una sola unità di traduzione, e:
int i;
in un altro, poi il compilatore probabilmente non può diagnosticare l'errore (e sono abbastanza sicuro che il comitato non volesse richiederlo). La mia ipotesi è che l'intento qui è un comportamento indefinito.
fonte
2013-01-23 18:27:36
Avere codice di esempio di come un 'envptr' sarebbe decorato con' __thread' (?), Ma un altro no? L'unico modo in cui posso immaginare questo è non-externs in due file diversi ..e se è così, allora sembra che potrebbe rispondere semplicemente in quel contesto. –
@ pst sì, è così che si fa. sono dichiarati nei file cpp e una funzione 'Env * getEnv();' è fornita in un'intestazione. Ogni file '.cpp' lo definisce diversamente. I thread che usano la versione TLS girano sul codice da un file '.so' caricato nello stesso processo del thread principale che usa la variabile non TLS (che è un compilatore JIT LLVM usato da una shell REPl). –
Ho votato per chiudere perché penso che abbia una soluzione davvero semplice: userò semplicemente un nome diverso per il file .cpp collegato alla DLL e per il file .cpp collegato all'eseguibile principale. EDIT: Questo limiterebbe l'applicabilità dei file .so, quindi mi piacerebbe provare ancora altri approcci. –