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.
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.
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.
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.
Tags und Links c c++ thread-local