Ist eine Thread-lokale Variable mit demselben Namen wie eine nicht-Thread-lokale Variable in Ordnung?

8

Ich habe eine Thread-lokale Variable envptr und eine Variable, die nicht thread-lokal ist, auch envptr genannt. Die letztere Variable wird nur in einem einzelnen Thread verwendet, dessen Ausführungscode die Thread-lokale Variablendeklaration nicht anzeigt. Die threadlokale Variable wird von verschiedenen Threads verwendet, von denen jeder die Deklaration der nicht threadlokalen Variablen nicht sieht oder nicht sehen muss.

Ist dieses Szenario möglich und erzeugt definiertes Verhalten? Ich benutze Linux 32bit und 64bit auf x86.

    
Johannes Schaub - litb 23.01.2013, 17:57
quelle

3 Antworten

3

Sind sie die gleiche Variable oder nicht? Mit anderen Worten, was ist ihre Verknüpfung ?

Wenn es extern ist, dann nein. Wenn es intern ist, dann ist es OK , es sei denn, die beiden Definitionen kommen beide in der gleichen Datei vor .

Wenn es keine Verknüpfung gibt, gibt es kein Problem.

Wenn ich etwas nicht übersehen habe, hat thread_local keinen Einfluss auf die Verknüpfung. Daher gelten die üblichen Regeln (und die Definition der Variablen thread_local in einer Übersetzungseinheit und nicht in einer anderen) ist ein Verstoß gegen die Definition Regel).

Ich denke, hier gibt es einen Fehler im Standard. Das Standard (§7.1.1 / 1) sagt, dass "Wenn thread_local in irgendeinem erscheint Deklaration einer Variablen soll es in allen vorhanden sein Erklärungen dieser Entität. "Es gibt keine ausdrückliche Aussage dass eine Diagnose nicht erforderlich ist, oder dass dies eine Verletzung ist Regel ist undefiniertes Verhalten, daher ist ein Compiler erforderlich den Fehler diagnostizieren. Außer natürlich, wenn Sie bei definieren Namensraumbereich:

%Vor%

in einer Übersetzungseinheit und:

%Vor%

in einem anderen, dann kann der Compiler wahrscheinlich den Fehler nicht diagnostizieren (und ich bin mir ziemlich sicher, dass der Ausschuss es nicht verlangen wollte). Meine Vermutung ist, dass die Absicht hier ein undefiniertes Verhalten ist.

    
James Kanze 23.01.2013, 18:27
quelle
3

Aus Ihrer Beschreibung klingt es, als ob es sich um zwei verschiedene Variablen handelt (keine der beiden verschattet die andere). In diesem Fall scheint es aus technischer Sicht vollkommen in Ordnung zu sein.

Das würde ich niemals vorschlagen, dies zu tun, weil die wahrscheinlichste Sache darin besteht, dass jemand verwirrt wird über die Bedeutung der zukünftigen Wartung und mehr Probleme verursachen wird, wenn er versucht, den Code zu verstehen.

    
Mark B 23.01.2013 18:03
quelle
3

Dies sollte funktionieren und korrektes Verhalten erzeugen, da die Variablen zwei unterschiedliche Variablen sind.

Ich würde dringend empfehlen, dies nicht zu tun, da dies die Software weniger wartungsfähig macht. Ob dieses Verhalten korrekt ist oder nicht, scheint weniger wichtig zu sein, denn wie verständlich der Code sein wird - es scheint problematisch, den gleichen Variablennamen für zwei Datensätze mit sehr unterschiedlichem Verhalten zu verwenden.

    
Reed Copsey 23.01.2013 17:58
quelle

Tags und Links